PHP 代码规范
FIG制定的
PHP
规范,简称PSR
,是PHP
开发的事实标准。FIG
是Framework Interoperability Group
(框架可互用小组) 的缩写,由几位开源框架的开发者成立于 2009 年。该组织的目的在于:以最低程度的限制,来统一各个项目的编码规范,避免各家自行发展的风格阻碍了程序设计师开发的困扰。PSR
是Proposing a Standards Recommendation
(提出标准建议) 的缩写。
PSR 原来有五个规范,分别是:
PSR-0 (Autoloading Standard)
自动加载标准。PSR-1 (Basic Coding Standard)
基础编码标准。PSR-2 (Coding Style Guide)
编码风格向导。PSR-3 (Logger Interface)
日志接口。PSR-4 (Improved Autoloading)
自动加载的增强版,可以替换掉PSR-0
了。
今天我们的代码规范是基于以上规范进行了整理。
1、PHP
源文件只能使用 <?php
和 <?=
这两种标签
<?php
标签通常用于纯PHP
的脚本当中,而<?=
通常用于模板当中。
2、PHP
源文件必须是不带 BOM
的 UTF-8
编码的文件
BOM(Byte Order Mark)
,字节顺序标记,出现在文本文件头部,Unicode
编码标准中用于标识文件是采用哪种格式的编码。
3、PHP
源文件缩进采用 4 个空格
很多编辑器使用
Tab
作为缩进。会造成空格性问题。
4、纯 PHP
代码的源文件关闭标签 ?>
必须省略
PHP
解析器在对文件进行解释的时候,会有性能提升。并且,这能一定程序避免在?>
之后有多余的空格导致程序报错。
5、请严格控制每行 120 个字符
过长的代码会导致多种分辨率的显示器造成兼容问题。并且,过长的代码也会造成难以阅读理解。如果实在太长,请把代码换行。
6、所有的类必须设定一个命令空间
命令空间给代码结构有较强的说明性,以及杜绝同名类的冲突问题。同时,也能用到 Composer 的自动加载优势特性。
<?php
namespace core;
7、命名空间(namespace
)的声明后面必须有一行空行
空行会让代码看起来更加清晰容易阅读。
<?php
namespace core;
use common;
8、所有的导入(use)声明必须放在命名空间(namespace)声明的下面
这样会让代码结构变得清晰容易阅读。
<?php
namespace core;
use common;
9、一句声明中,必须只有一个导入(use)关键字
虽然 PHP 允许一行代码当中允许使用多个 use 关键字导入一个类。但是,这会使代码阅读造成障碍。
错误:
<?php
namespace core;
use common, library;
正确:
<?php
namespace core;
use common;
use library;
10、在导入(use)声明代码块后面必须有一行空行
空行让代码结构变得容易理解。
<?php
namespace core;
use common;
use library;
class Person {
}
11、PHP 关键字必须小写
PHP 的关键字,必须小写,boolean 值:true,false,null 也必须小写。下面的关键字,也必须小写:
'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break', 'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue', 'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty', 'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch', 'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach', 'function', 'global', 'goto', 'if', 'implements', 'include', 'include_once', 'instanceof', 'insteadof', 'interface', 'isset', 'list', 'namespace', 'new', 'or', 'print', 'private', 'protected', 'public', 'require', 'require_once', 'return', 'static', 'switch', 'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'
12、继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写。
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{ // 换行写{
}
13、成员属性访问修饰符必须显示声明不能省略
成员属性有三种访问修饰符:
public
、protected
、private
。不能使用老式的var
来声音成员属性。
<?php
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
public $foo = null;
private $name = 'sam';
protected $age = '17';
}
14、成员方法访问修饰符必须显示声明不能省略
成员方法有三种访问修饰符:
public
、protected
、private
。
错误:
<?php
namespace Lib\Databases;
class MySQL
{
function fetchOne()
{
// ......
}
}
正确:
<?php
namespace Lib\Databases;
class MySQL
{
public function fetchOne()
{
// ......
}
}
15、方法的参数有多个的时候,每个参数的逗号后面必须加个空格
namespace Lib\Databaes;
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
public getInfo ($name, $age, $gender = 1)
{
}
}
16、当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明(public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面。
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo; // static 放后面
abstract protected function zim(); // abstract 放前面
final public static function bar() // final 放前面,static 放最后。
{
// 方法主体部分
}
}
17、控制结构花括号、换行、空格等规范
if、else、elseif、switch、for、foreach、case、while、go、try、catch 等关键词后面必须加空格。可以说,没有特殊说明的情况下,基本上所有的 PHP 关键词后面都必须加空格。
流程控制语句起始的花括号是不需要另起一行。
if ($expr1) { // 左右空格
// if body
} elseif ($expr2) { // elesif 连着写
// elseif body
} else {
// else body;
}
switch ($expr) { // 左右空格
case 0:
echo 'First case, with a break'; // 对齐
break; // 换行写break,也对齐。
case 1:
echo 'Second case, which falls through';
// no break
case 2:
case 3:
case 4:
echo 'Third case, return instead of break';
return;
default:
echo 'Default case';
break;
}
while ($expr) { // 左右空格
// structure body
}
do {
// structure body; // 左右空格
} while ($expr);
for ($i = 0; $i < 10; $i++) { // 注意几个参数之间的空格
// for body
}
foreach ($iterable as $key => $value) { // 还是空格问题
// foreach body
}
try {
// try body
} catch (FirstExceptionType $e) { // 同样也是注意空格。
// catch body
} catch (OtherExceptionType $e) {
// catch body
}
18、类名必须与文件名一样
这个很容易理解,没啥好补充说明的。除非框架有特殊的加载规则。
19、类的命名必须遵循 StudlyCaps
大写开头的驼峰命名规范
StudlyCaps 即单词首字母大写风格。有些人也称它为大驼峰。
20、方法名称必须符合 camelCase
式的小写开头驼峰命名规范
camelCase 即第一个单词首字母小写后面的单词首字母大写的风格。
21、类中的常量所有字母都必须大写,单词间用下划线分隔
CONST ORDER_STATUS = 1;
22、变量必须使用小驼峰命名风格
$cardNo = ''; // 卡号。
$idCardNo = ''; // 身份证号。
23、参数必须使用驼峰命名风格
参数也是变量的一种。故与变量的命名风格一致。
24、所有方法的起始花括号必须另起一行。
虽然以下两种在实际开发中都是允许的。但是,为了保持代码一致。所以,必须强制使用。
错误:
<?php
class MySQL
{
public function fetchOne() {
}
}
正确:
<?php
class MySQL
{
public function fetchOne()
{
}
}
25、直接在方法中写数组参数时格式如下
$object->callFunc([
'userId' => 1,
'username' => 'sam',
'age' => 20,
'sex' => 'male'
]);
26、方法参数注释
/**
* 管理后台获取优惠券发送记录。
*
* @author 7031 2018-02-23
* @modify 7031 2019-02-25 修复了 SQL 性能问题。
*
* @param int $couponId 优惠券ID。
* @param string $username 用户名。
* @param string $mobilephone 用户手机号。
* @param int $page 当前分页页码。
* @param int $count 每页显示条数。
* @param array $data 请求参数。
*
* ------------------- eg:start ---------------------
* $data = [
* 'username' => '用户账号,没有时传空字符串',
* 'age' => '用户年龄,没有时传0',
* ];
* ------------------- eg:end -----------------------
*
* @return array
*/
public static function getBackendSendHistory($couponId = -1, $username, $mobilephone, $page, $count, $data) {
}
可以看出,有以下几个注释特点:
1)方法说明。
2)创建方法的同事编号以及时间。
3)修改方法的同事编号以及时间与修改的内容。
4)参数注释:类型、名称、参数说明。参数与其他注释之间要有空行。
5)参数示例:如果参数当中有复杂的参数。可以在参数下方给出示例以增强说明。
6)返回值。需要给出返回的类型。
27、方法的代码行数不能超过一屏
每个人的显示器分辨率不一样。既然不超过一屏也会出现别的同事一屏会超出的情况。所以,即使未超过一屏,也尽量保证代码行在 40 行以内。如果发现自己的代码超过了 40 行,那么就需要考虑自己的代码是不是有拆分不合理的地方。特殊情况允许超过 40 行。但是,整个方法里面的代码必须是简单的判断逻辑。不包含复杂的业务判断逻辑。因为,不同的业务判断最佳实践是单独封装一个方法。
作者:fingerQin
链接:https://www.jianshu.com/p/fa7830236de3
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
PHP 代码规范的更多相关文章
- iOS代码规范(OC和Swift)
下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...
- 谈谈PHP代码规范
[转] http://www.syyong.com/php/Talk-about-PHP-code-specification.html 我向往这样一个php世界,里面没有代码规范之争.你我都一样,都 ...
- 2016 正确 sublime安装PHPcs PHPcodesniffer代码规范提示插件,修正网上部分不详细描述
对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香!-------------------14:37 2016/3/212016 正确 sublime安装PHPcs PHPcodesniff ...
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
类型判断符号: C#:object a; if(a is int) { } 用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...
- 作业三: 代码规范、代码复审、PSP
分) 对于是否需要有代码规范,请考虑下列论点并反驳/支持: 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 我是个艺术家,手艺人,我有自己的规范和原则. 规范不能 ...
- 转!!Java代码规范、格式化和checkstyle检查配置文档
为便于规范各位开发人员代码.提高代码质量,研发中心需要启动代码评审机制.为了加快代码评审的速度,减少不必要的时间,可以加入一些代码评审的静态检查工具,另外需要为研发中心配置统一的编码模板和代码格式化模 ...
- C#代码规范
C#代码规范 一.文件命名 1 文件名 文件名统一使用帕斯卡命名法,以C#类名命名,拓展名小写. 示例: GameManager.cs 2 文件注释 每个文件头须包含注释说明,文件头位置指的是文件最 ...
- 【转】Java代码规范
[转]Java代码规范 http://blog.csdn.net/huaishu/article/details/26725539
- 作业三:代码规范、代码复审、PSP
一.代码规范 我认为我们编写的代码都需要进行规范的操作,因为如果为了图省事情或者为了减少时间去完成这个编程.在最后检验的时候就会出现一些警告,导致你这次编程的代码出现问题,当出现问题的时候你在回头去检 ...
- 关于"是否需要有代码规范"的个人看法
这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 我是个艺术家,手艺人,我有自己的规范和原则. 规范不能强求一律,应该允许很多例外. 我擅长制定编码规范,你们听我的 ...
随机推荐
- Tomcat、Websphere和Jboss类加载机制
http://blog.csdn.net/lshxy320/article/details/6448972 2 Tomcat 类加载机制 Tomcat Server 在启动的时候将构造一个 ...
- 数据库对m³等特殊符号的支持
目前我只遇到过m³这个特殊符号,会影响正常使用. 比如,我在数据库中搜索: select * from table where container='10m³'; 即使数据库中对应的值,但也无法搜索出 ...
- 【HTML5 WebSocket】WebSocket对象特性和方法
<HTML5 WebSocket权威指南>学习笔记&3 WebSocket方法的对象特性 1. WebSocket方法 a. send方法 send方法用于在WebSocket连接 ...
- C#线程同步技术(二) Interlocked 类
接昨天谈及的线程同步问题,今天介绍一个比较简单的类,Interlocked.它提供了以线程安全的方式递增.递减.交换和读取值的方法. 它的特点是: 1.相对于其他线程同步技术,速度会快很多. 2.只能 ...
- python-创建列表
创建个空列表 album = [] 创建非空列表 album = ['Black Star','David Bowie',25.True] 向列表中添加新的元素 append 方法,元素自动地排列到列 ...
- 教程:VS2010 之TFS入门指南(转载)
[原文发表地址] Tutorial: Getting Started with TFS in VS2010 [原文发表时间] Wednesday, October 21, 2009 1:00 PM 本 ...
- composer自动加载一个文件后必须执行命令composer dump-autoload
"autoload": { "classmap": [ "database" ], "psr-4": { "A ...
- 实战Nginx负载均衡高冗余高可用WEB架构
最近公司主力网站之一改版完成终于上线了,牵扯了我大半年的时间,现在终于有时间坐下来写点东西,总结沉淀一下自己的技术心得.此次,根据服务器的数量和质量,我采用负载均衡高冗余的架构,考虑单点故障,W ...
- redis windows 下安装及使用
1.下载redis https://github.com/MSOpenTech/redis 2.解压下载的文档,比如D:\devSoft\redis-2.8.19 redis-benchmark.ex ...
- size_t详细解释
在学习sizeof运算符的时候,它的值类型为size_t,结果在使用printf函数显示的时候,凭空多了很多警告,有点不不理解,为啥搞这么复杂?直接用个int类型多省事? 经过一番搜索和阅读文档,找到 ...