php编码规范
2016-06-28 13:26
411 查看
转至元数据结尾
转至元数据起始
基本代码规范
本节我们将会讨论一些基本的代码规范问题,以此作为将来讨论更高级别的代码分享和技术互用的基础。RFC 2119中的
必须(MUST),
不可(MUST NOT),
建议(SHOULD),
不建议(SHOULD NOT),
可以/可能(MAY)等关键词将在本节用来做一些解释性的描述。
1. 概述
源文件必须只使用
<?php和
<?=这两种标签。
源文件中php代码的编码格式
必须只使用不带
字节顺序标记(BOM)的
UTF-8。
一个源文件
建议只用来做声明(
类(class),
函数(function),
常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改
.ini配置等),但
不建议同时做这两件事。
命名空间(namespace)和
类(class)
必须遵守PSR-0标准。
类名(class name)
必须使用
骆驼式(StudlyCaps)写法 (译者注:
驼峰式(cameCase)的一种变种,后文将直接用
StudlyCaps表示)。
类(class)中的常量
必须只由大写字母和
下划线(_)组成。
方法名(method name)
必须使用
驼峰式(cameCase)写法(译者注:后文将直接用
camelCase表示)。
2. 文件
2.1. PHP标签
PHP代码必须只使用
长标签(<?php ?>)或者
短输出式标签(<?= ?>);而
不可使用其他标签。
2.2. 字符编码
PHP代码的编码格式必须只使用不带
字节顺序标记(BOM)的
UTF-8。
2.3. 副作用
一个源文件建议只用来做声明(
类(class),
函数(function),
常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改
.ini配置等),但
不建议同时做这两件事。
短语
副作用(side effects)的意思是 在包含文件时 所执行的逻辑与所声明的
类(class),
函数(function),
常量(constant)等没有直接的关系。
副作用(side effects)包含但不局限于:产生输出,显式地使用
require或
include,连接外部服务,修改ini配置,触发错误或异常,修改全局或者静态变量,读取或修改文件等等
下面是一个既包含声明又有副作用的示例文件;即应避免的例子:
<?php // 副作用:修改了ini配置 ini_set('error_reporting', E_ALL); // 副作用:载入了文件 include "file.php"; // 副作用:产生了输出 echo "<html>\n"; // 声明 function foo() { // 函数体 }
下面是一个仅包含声明的示例文件;即应提倡的例子:
<?php // 声明 function foo() { // 函数体 } // 条件式声明不算做是副作用 if (! function_exists('bar')) { function bar() { // 函数体 } }
3. 空间名(namespace)
和类名(class
name)
命名空间(namespace)和
类(class)必须遵守 PSR-0.
这意味着一个源文件中只能有一个
类(class),并且每个
类(class)至少要有一级
空间名(namespace):即一个顶级的
组织名(vendor name)。
类名(class name)
必须使用
StudlyCaps写法。
PHP5.3之后的代码
必须使用正式的
命名空间(namespace)例子:
<?php // PHP 5.3 及之后: namespace Vendor\Model; class Foo { }
PHP5.2.x之前的代码
建议用伪命名空间
Vendor_作为
类名(class name)的前缀
<?php // PHP 5.2.x 及之前: class Vendor_Model_Foo { }
4.
类的常量、属性和方法
术语类(class)指所有的
类(class),
接口(interface)和
特性(trait)
4.1. 常量
类常量必须只由大写字母和
下划线(_)组成。 例子:
<?php namespace Vendor\Model; class Foo { const VERSION = '1.0'; const DATE_APPROVED = '2012-06-01'; }
4.2. 属性
属性则必须使用
$unser_score风格来声明。
4.3. 方法
方法名则必须使用
camelCase()风格来声明。
代码风格指南
本手册是基础代码规范(PSR-1)的继承和扩展。为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的。
各个成员项目间的共性组成了这组代码规范。当开发者们在多个项目中合作时,本指南将会成为所有这些项目中共用的一组代码规范。 因此,本指南的益处不在于这些规则本身,而在于在所有项目中共用这些规则。
RFC 2119中的
必须(MUST),
不可(MUST NOT),
建议(SHOULD),
不建议(SHOULD NOT),
可以/可能(MAY)等关键词将在本节用来做一些解释性的描述。
1. 概述
代码必须遵守 PSR-1。
代码
必须使用4个空格来进行缩进,而不是用制表符。
一行代码的长度
不建议有硬限制;软限制
必须为120个字符,
建议每行代码80个字符或者更少。
在
命名空间(namespace)的声明下面
必须有一行空行,并且在
导入(use)的声明下面也
必须有一行空行。
类(class)的左花括号
必须放到其声明同一行,右花括号则
必须放到类主体下面自成一行。
方法(method)的左花括号
必须放到其声明同一行,右花括号则
必须放到方法主体的下一行。
所有的
属性(property)和
方法(method)
必须有可见性声明;
抽象(abstract)和
终结(final)声明
必须在可见性声明之前;而
静态(static)声明
必须在可见性声明之后。
在控制结构关键字的后面
必须有一个空格;而
方法(method)和
函数(function)的关键字的后面
不可有空格。
控制结构的左花括号
必须跟其放在同一行,右花括号
必须放在该控制结构代码主体的下一行。
控制结构的左括号之后
不可有空格,右括号之前也
不可有空格。
1.1. 示例
这个示例中简单展示了上文中提到的一些规则:<?php namespace Vendor\Package; use FooInterface; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class Foo extends Bar implements FooInterface { public function sampleFunction($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // 方法主体 } }
2. 通则
2.1 基础代码规范
代码必须遵守 PSR-1 中的所有规则。
2.2 源文件
所有的PHP源文件必须使用Unix LF(换行)作为行结束符。
所有PHP源文件
必须以一个空行结束。
纯PHP代码源文件的关闭标签
?>
必须省略。
2.3. 行
行长度不可有硬限制。
行长度的软限制
必须是120个字符;对于软限制,代码风格检查器
必须警告但
不可报错。
一行代码的长度
不建议超过80个字符;较长的行
建议拆分成多个不超过80个字符的子行。
在非空行后面
不可有空格。
空行
可以用来增强可读性和区分相关代码块。
一行
不可多于一个语句。
2.4. 缩进
代码必须使用4个空格,且
不可使用制表符来作为缩进。
注意:代码中只使用空格,且不和制表符混合使用,将会对避免代码差异,补丁,历史和注解中的一些问题有帮助。空格的使用还可以使通过调整细微的缩进来改进行间对齐变得更加的简单。
2.5. 关键字和 True/False/Null
PHP关键字(keywords)必须使用小写字母。
PHP常量
true,
false和
null
必须使用小写字母。
3. 命名空间(Namespace)
和导入(Use)
声明
命名空间(namespace)的声明后面
必须有一行空行。
所有的
导入(use)声明
必须放在
命名空间(namespace)声明的下面。
一句声明中,
必须只有一个
导入(use)关键字。
在
导入(use)声明代码块后面
必须有一行空行。
示例:
<?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; // ... 其它PHP代码 ...
4. 类(class)
,属性(property)
和方法(method)
术语“类”指所有的类(class),
接口(interface)和
特性(trait)。
4.1. 扩展(extend)
和实现(implement)
一个类的扩展(extend)和
实现(implement)关键词
必须和
类名(class name)在同一行。
类(class)的左花括号
必须放在同一行;右花括号必须放在
类(class)主体的后面自成一行。
<?php namespace Vendor\Package; use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass; class ClassName extends ParentClass implements \ArrayAccess, \Countable { // 常量、属性、方法 }
4.2. 属性(property)
所有的属性(property)都
必须声明其可见性。
变量(var)关键字
不可用来声明一个
属性(property)。
一条语句
不可声明多个
属性(property)。
一个
属性(property)声明看起来应该像下面这样。
<?php namespace Vendor\Package; class ClassName { public $foo = null; }
4.3. 方法(method)
所有的方法(method)都
必须声明其可见性。
方法名(method name)其左花括号
必须放在同一行,且右花括号
必须放在方法主体的下面自成一行。左括号后面
不可有空格,且右括号前面也
不可有空格。
一个
方法(method)声明看来应该像下面这样。 注意括号,逗号,空格和花括号的位置:
<?php namespace Vendor\Package; class ClassName { public function fooBarBaz($arg1, &$arg2, $arg3 = []) { // 方法主体部分 } }
4.4. 方法(method)
的参数
在参数列表中,逗号之前不可有空格,而逗号之后则
必须要有一个空格。
方法(method)中有默认值的参数必须放在参数列表的最后面。
<?php namespace Vendor\Package; class ClassName { public function foo($arg1, &$arg2, $arg3 = []) { // 方法主体部分 } }
4.5. 抽象(abstract)
,终结(final)
和 静态(static)
当用到�抽象(abstract)和
终结(final)来做类声明时,它们
必须放在可见性声明的前面。
而当用到
静态(static)来做类声明时,则
必须放在可见性声明的后面。
<?php namespace Vendor\Package; abstract class ClassName { protected static $foo; abstract protected function zim(); final public static function bar() { // 方法主体部分 } }
4.6.
调用方法和函数
调用一个方法或函数时,在方法名或者函数名和左括号之间不可有空格,左括号之后
不可有空格,右括号之前也
不可有空格。参数列表中,逗号之前
不可有空格,逗号之后则
必须有一个空格。
<?php bar(); $foo->bar($arg1); Foo::bar($arg2, $arg3);
5. 控制结构
下面是对于控制结构代码风格的概括:控制结构的关键词之后
必须有一个空格。
控制结构的左括号之后
不可有空格。
控制结构的右括号之前
不可有空格。
控制结构的右括号和左花括号之间
必须有一个空格。
控制结构的代码主体
必须进行一次缩进。
控制结构的右花括号
必须主体的下一行。
每个控制结构的代码主体
必须被括在花括号里。这样可是使代码看上去更加标准化,并且加入新代码的时候还可以因此而减少引入错误的可能性。
5.1. if
,elseif
,else
下面是一个if条件控制结构的示例,注意其中括号,空格和花括号的位置。同时注意
else和
elseif要和前一个条件控制结构的右花括号在同一行。
<?php if ($expr1) { // if body } elseif ($expr2) { // elseif body } else { // else body; }
推荐用
elseif来替代
else if,以保持所有的条件控制关键字看起来像是一个单词。
5.2. switch
,case
下面是一个switch条件控制结构的示例,注意其中括号,空格和花括号的位置。
case语句
必须要缩进一级,而
break关键字(或其他中止关键字)
必须和
case结构的代码主体在同一个缩进层级。如果一个有主体代码的
case结构故意的继续向下执行则
必须要有一个类似于
// no break的注释。
<?php switch ($expr) { case 0: echo 'First case, with a 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; }
5.3. while
,do while
下面是一个while循环控制结构的示例,注意其中括号,空格和花括号的位置。
<?php while ($expr) { // structure body }
下面是一个
do while循环控制结构的示例,注意其中括号,空格和花括号的位置。
<?php do { // structure body; } while ($expr);
5.4. for
下面是一个for循环控制结构的示例,注意其中括号,空格和花括号的位置。
<?php for ($i = 0; $i < 10; $i++) { // for body }
5.5. foreach
下面是一个foreach循环控制结构的示例,注意其中括号,空格和花括号的位置。
<?php foreach ($iterable as $key => $value) { // foreach body }
5.6. try
, catch
下面是一个try catch异常处理控制结构的示例,注意其中括号,空格和花括号的位置。
<?php try { // try body } catch (FirstExceptionType $e) { // catch body } catch (OtherExceptionType $e) { // catch body }
赞同
相关文章推荐
- PHP计算文件夹大小
- VSFTPD 的那些坑
- 一起来花5分钟写一个PHP入门Demo
- C#/JAVA/PHP 互通DES加解密算法(ECB模式支持8位)
- phpcms源码跟踪(1)
- SMTP 发送邮件 字符串拼接
- PHP实现自己的验证码(实例)
- php表单提交
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toStr
- php设计模式-观察者模式
- Windows下用IIS搭建ftp服务器不能使用详解
- php 读取表结构自动生成php操作类
- Yii登录验证和全局访问用户ID
- TP框架验证码及文件上传
- 远程服务器的环境的配置
- PHP语言开发Paypal支付demo的具体实现
- PHPunit用法和xml文件
- php中namespace和use的用法
- PHP函数篇之掌握ord()与chr()函数应用
- php 导入excel 方法