GVKun编程网logo

PHP 编码规范(21)(php编码规范有哪些)

3

这篇文章主要围绕PHP编码规范(21)和php编码规范有哪些展开,旨在为您提供一份详细的参考资料。我们将全面介绍PHP编码规范(21)的优缺点,解答php编码规范有哪些的相关问题,同时也会为您带来PH

这篇文章主要围绕PHP 编码规范(21)php编码规范有哪些展开,旨在为您提供一份详细的参考资料。我们将全面介绍PHP 编码规范(21)的优缺点,解答php编码规范有哪些的相关问题,同时也会为您带来PHP - 编码规范 v1.0、php psr 编码规范(PSR-[0-4])、PHP 编码规范、PHP 编码规范 (PSR-3)- 日志接口规范的实用方法。

本文目录一览:

PHP 编码规范(21)(php编码规范有哪些)

PHP 编码规范(21)(php编码规范有哪些)

8.3 函数

方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。
function run();
function runFast();
function getBackground();

通常每个方法都是执行一个动作的,所以对它的命名应该清楚的说明它是做什么的:用checkForErrors()代替errorCheck(),用dumpDataToFile()代替dataFile()。这么做也可以使功能和数据成为更可区分的物体。

有时后缀名是有用的:
Max - 含义为某实体所能赋予的最大值。
Cnt - 一个运行中的计数变量的当前值。
Key - 键值。
例如:retryMax 表示最多重试次数,retryCnt 表示当前重试次数。

有时前缀名是有用的:
is - 含义为问一个关于某样事物的问题。无论何时,当人们看到Is就会知道这是一个问题。
get - 含义为取得一个数值。
set - 含义为设定一个数值
例如:isHitRetryLimit



PHP - 编码规范 v1.0

PHP - 编码规范 v1.0

一、 命名规则

1. 命名规则概要

1) 使用含义丰富的名字

# good
if ($currentYear > 2009) ...

# bad
if($t > 2009) ...    

2) 在缩写中,只将首字母大写

# good
function getHttpHost()

#bad
function getHTTPHost()    

2. 类命名

1) 类应该以名词单数形式, 首字母大写, 大小写混排,方式命名

class SqlStatement {    ...    }

2) 表示一组事物的类应使用复数形式

class SqlStatements {    ...    } 

3) 类型开头要比以类型结尾更容易识别
对一个已知类型的变量来说, 其名称以类型开头要比以类型结尾更容易识别

class ErrorConnection extends Error {
    // ...    
}     

$arrCatids = array(1,2,3,4,5,6);
$strCatids = ‘1,2,3,4,5,6’; 

4) 接口的默认实现类可以以Default开头

class DefaultSqlBuilder extends ISqlBuilder {
    //...    
} 

3. 接口命名

接口的名字应为以字母”I”开头的名词或形容词

interface ISqlEngine{}    interface ISortable{}

4. 变量/属性命名

1) 属性名应以小写字母开头, 采用驼峰法则.

public $userAuth;

3) 常量的名字必须全部为大写字母
所有字母大写,单词之间用下划线分割

const SEARCH_GOOGLE = 1;    
const SEARCH_YAHOO  = 2;

4) 命名一组对象时,应使用复数形式

public $books;

5) 布尔型变量不应使用否定性名字

# good
public $isFound;    
public $isEnough;

# bad
public $isNotFound;    
public $isNotEnough;

6) 在嵌套循环中,使用有意义丰富的名字来命名循环控制变量

# good
for($row = 0; $i < getRows();$row++) {    
    for($col= 0;$j < getCols(); $col++) {
        // ...    
    }    
}

# bad
for($i = 0; $i < getRows();$i++) {
    for($j= 0;$j < getCols(); $j++){
        // ...    
    }    
}

7) 传入的变量采用蛇形写法, 自定义函数变量采用蛇形写法

# 控制器变量
class UserController extends Controller{
    function postLogin(Request $request) {
        // 这里是蛇形写法
        $order_status = $request->input(''order_status'');
    }
}

# 自定义函数变量
# 这里传入的变量采用蛇形写法
function route_url($route, $params, $option_params){
    // ...
}

5. 函数命名

禁止拼音命名法

1) 类函数名称以小写字母开头, 采用驼峰法则

function getCurrentYear()

2) 用动词命名函数

# 动词表:
add / edit / remove 
begin / end
create / destroy
first / last 
get / release
get / set
increment / decrement
put / get
lock / unlock 
open / close
min / max 
old / new 
start / stop
next / previous 
source / target 
show / hide
send / receive
cut / paste 
up / down

# 系词表:
is / has
function startDatabase()
function getDatabaseStatus()

3) 函数名字可以忽略类或对象名称,以避免重复

# good
class Font {
    function getFamily();
}

# bad
class Font {    
    function getFontFamily();
}

4) 单例类应该通过一个名为getInstance()的静态函数返回他们唯一的值

class Toolkit {    
    private static const toolkit = new Toolkit();
    public static function getInstance(){
        return toolkit; 
    }    
} 

二、 文件格式/ 技巧

1. 留白

恰当的使用空格可以有效提高代码的可读性

1) 使用空格的通用规则

  1. 操作符,冒号的前后都应有一个空格.

  2. 逗号,分号之后须有一个空格

# good
$bit = $bitStart + $bitEnd;
case ''someStr'' :
mysqlConnection($config, $dbname);
if($count > 9)

#bad
$bit=$bitStart+$bitEnd;    
case ''someStr'':    
mysqlConnection($config,$dbname);
if($count>9)    

2) 逻辑单元应该以空行分割

function drawCapture() {    
    $chars = getChars(5);
    
    // imageCreate
    $img = imageCreate();
    
    // output image
    outputImage();    
} 

2. 控制流程

1) for,while,if语句格式如下

# for
for (init; condition; update) {    
    // ...    
} 

# while
while (condition) {    
    // ...    
} 

# if
if (condition) {
    // ...    
} else if (condition) {    
    // ...    
} else {
    // ...    
} 

2) 循环/条件语句必须以 ‘{‘ , ’}’嵌套

# good
if ($i > 0) {
    $val ++;    
}
for ($i = 0; $i < $size; $i++) {    
    $val ++;    
}

# bad 
for($i=0; $i<$size; $i++)    $val ++;
if($i > 0)    $val ++;

3) 使用临时变量以避免复合条件语句

# good
$itemValid = $itemMoney > 800 && $level > 3 && $valid > 0;
if($itemValid && isReady()) {
    display();    
}

# bad
if($itemMoney > 800 && $level > 3 && $valid > 0 && isReady()) {    
    display();    
}

4) Switches 语句应该套用以下格式,并且每个分支必须注释清楚

switch (condition) {
    case 0:            
    // show something
        break;    
    default:
    // this is some code
}

3. 声明

1) 类/接口声明顺序
类文档中的语句的顺序.

1.    文档/注释
2.    类/接口语句
3.    常量
4.    静态变量顺序:[public, protected, (default), private]
5.    实例变量顺序:[public, protected, (default), private]
6.    构造函数 __construct();
7.    函数 function;

2) 变量的声明要在代码块的开头,而不是在用到它们的地方

public function method() {
    $value = 0;
    ...    
    for (...) {    
        $value += $num;    
    }    
} 

4. 技巧

删除文件尾部的 ?>

php文件的典型标记是以 <?php开头, ?>结尾。但是在Zend Framework中却不推荐在php文件末尾加 ?>
因为在<?php ?>之外的任何字符都会被输出到网页上,而之中的却不会。所以在末尾不加?>可以预防php文件被恶意加入字符输出到网页。

数组的键名

在PHP中, 使用不经单引号包含的字符串作为数组键名是合法的, 但是我们不希望如此 -- 键名应该总是由单引号包含而避免引起混淆. 注意这是使用一个字符串, 而不是使用变量做键名的情况

// 错误    
$foo = $assoc_array[blah];
// 正确
$foo = $assoc_array[''blah''];
// 错误
$foo = $assoc_array["$var"];
// 正确    
$foo = $assoc_array[$var]; 

不要使用未初始化的变量

// 错误    
if ($forum) ...
// 正确
if (isset($forum)) ...
// 正确    
if (isset($forum) && $forum == 5) 

避免在大数组上使用 in_array()

避免在大的数组上使用 in_array(), 同时避免在循环中对包含200个以上元素的数组使用这个函数. in_array()会非常消耗资源. 对于小的数组这种影响可能很小, 但是在一个循环中检查大数组可能会需要好几秒钟的时间. 如果您确实需要这个功能, 请使用isset()来查找数组元素. 实际上是使用键名来查询键值. 调用 isset($array[$var]) 会比 in_array($var, array_keys($array)) 要快得多.

SQL 脚本格式

SQL 代码常常会变得很长, 如果不作一定的格式规范, 将很难读懂. SQL代码一般按照以下的格式书写, 以关键字换行:

$sql = ''SELECT *     
<-one tab->FROM '' . SOME_TABLE . '' 
<-one tab->WHERE a = 1 
<-two tabs->AND (b = 2 
<-three tabs->OR b = 3)     
<-one tab->ORDER BY b''; 

这里是应用了制表符後的例子:

$sql = ''SELECT *
    FROM '' . SOME_TABLE . '' 
    WHERE a = 1 
        AND (b = 2 
            OR b = 3)        
    ORDER BY b'';     

禁止使用单字母开头的变量

$tKey, $tVal

5. 空行的使用

  • <?php 之后必须有1个空行

  • 两个函数之间必须有1个空行。

  • return、die、exit之前如果有其他语句的情况下应加上一个空行

三、 文档与注释

1. PHPDoc

PHPDoc 是一个 PHP 版的 Javadoc。它是一种注释 PHP 代码的正式标准。它支持通过类似 phpDocumentor 这样的外部文档生成器生成 API 文档,也可以帮助一些例如 Zend Studio, NetBeans, ActiveState Komodo Edit and IDE 和 Aptana Studio 之类的 集成开发环境 理解变量类型和弱类型语言中的其他歧义并提供改进的代码完成,类型提示和除错功能。
参考地址: http://zh.wikipedia.org/zh/PH...

2. 注释

注释类

/**
 * 这是某个类的介绍
 */    
class SomeClass{}

注释局部变量

function someFunction(){    
    var $result;          //获取到的结果集
    var $searchResult;   //获取到的搜索结果集    
    // ...
}

注释变量

/** @var name string */
public $name 

注释函数
注释的标记应按照以下顺序

*     @param
*     @return
*     @see

3. PHP文档头部注释

/**
 * 文件头部说明
 * 
 * @author     Mark (zhaody901@126.com)
 * @copyright  Copyright (c) 2014-2016 sour-lemon team
 */

框架常用命名

控制器方法

getIndex()     # 列表
getCreate()    # 创建
postCreate()   # 保存创建
getEdit()      # 编辑
postEdit()     # 保存编辑
postUpdate()   # 批量更新
postDelete()   # 删除到回收站
postDestroy()  # 彻底删除

附录Appendices

附录A:参考文档

  • PHPBB 编码规范
    http://www.phpbbchina.com/wik...编码规范

  • Typecho PHP 编码规范
    https://code.google.com/p/typ...

  • 优化编写代码过程中的PHP
    http://www.yeeyan.org/article...

附录B:PHPDoc 标签参考

在线版地址 : http://manual.phpdoc.org/HTML...

@abstract        Documents an abstract class, class variable or method.
@access    public, private or protected    Documents access control for an element. @access private indicates that documentation of element be prevented.
@author    author name <author@email>    Documents the author of the current element.
@category        Specify a category to organize the documented element’s package into
@copyright    name date    Documents copyright information.
@deprecated    version    Documents a method as deprecated.
@example    /path/to/example    Documents the location of an external saved example file.
@exception        documents an exception thrown by a method — also see @throws.
@global    type $globalvarname    Documents a global variable or its use in a function or method.
@ignore        Prevents the documentation of an element
@internal        private information for advanced developers
@link    URL    
@name    global variable name    Specifies an alias for a variable. For example, $GLOBALS[‘myvariable’] becomes $myvariable
@magic        phpDocumentor tags}-.
@package    name of a package    Documents a group of related classes and functions.
@param    type [$varname] description    
@return    type description    This tag should not be used for constructors or methods defined with a void return type.
@see        Documents an association to another method or class.
@since    version    Documents when a method was added to a class.
@static        Documents a static class or method
@staticvar        Documents a static variable’s use in a function or class
@subpackage        
@throws        Documents an exception thrown by a method.
@todo        Documents things that need to be done to the code at a later date.
@var    type    a data type for a class variable
@version        Provides the version number of a class or method.

附录C: 版本变化

v1.4(2016年10月07日)

更改为markdown格式, 并且将其替换为Laravel 编码格式

V1.3(2015年4月19日)

项目文件结构说明

V1.2(2013年4月27日)

分离项目公共部分

V1.1(2013年4月2日)

增加左格式化内容
增加删除 ?> 标记

V1.0(2012年11月7日)

初始化规范

php psr 编码规范(PSR-[0-4])

php psr 编码规范(PSR-[0-4])

PSR 是 PHP Standard Recommendation 的简写,即PHP推荐标准。

目前通过的规范有 PSR-0(Autoloading Standard)、PSR-1(Basic Coding Standard)、PSR-2(Coding Style Guide)、PSR-3(Logger Interface)、PSR-4(Improved Autoloading)。

PSR 不是PHP官方标准,而是从如Zend、Symfony2等知名PHP项目中提炼出来的一系列标准,目前有越来越多的社区项目加入并遵循该标准。

PHP FIG(Framework Interoperability Group)框架可互用性小组是制定PSR开发规范的组织。他们的目的在于以最低程度的限制制定一个统一的标准,让各个框架遵循统一的编码规范。

 

====================PSR-0(自动加载规范)=======================

PSR-0(Autoloading Standard)类自动加载规范,该规范现已废弃(Deprecated),它将由PSR-4替代。

1.一个完全合格的命名空间和类名必须遵循以下结构 "\VendorName\Namespace\ClassName"

2.每个命名空间必须有顶级的命名空间 "VendorName"

3.每个命名空间可以有任意多个子命名空间

4.每个命名空间在被文件系统加载时必须被转换为操作系统路径分隔符 (DIRECTORY_SEPARATOR)

5.每个"_"字符在"类名"中被转换为DIRECTORY_SEPARATOR。而在 PSR-4 中使用下划线没有任何特殊含义

6.符合命名标准的命名空间和类名必须以".php"结尾来加载文件

7.命名空间和类名可以由大小写字母组成,但必须对大小写敏感以保证多系统兼容性

 

====================PSR-1(基本代码规范)=======================

PSR-1(Basic Coding Standard)基本代码规范,用以确保共享的PHP代码间具有较高程度的技术互通性。

1.PHP代码源文件必须以 <?php 或 <?= 标签开始

2.PHP代码源文件必须使用不带 BOM 的 UTF-8 编码

3.一个源文件建议只用作定义类、函数、常量等声明,或者其他产生从属效应的操作(如:输出信息,修改配置文件等)

4.命名空间以及类必须符合 PSR 的自动加载规范:PSR-0 或 PSR-4

5.类的命名必须遵循 StudlyCaps 大写开头的驼峰式命名规范

6.类中的常量所有字母都必须大写,单词间用下划线分隔

7.方法名必须符合 camelCase 式的小写开头驼峰式命名规范

 

* BOM(byte order mark)是 Unicode 标准的一部分,通常用于标记纯文本字节序(byte order),使得文本处理程序能够识别读入的文件使用的 Unicode 编码(UTF-8、UTF-16、UTF-32)。

* 从属效应是指仅仅通过包含文件,不直接声明类、函数和常量而执行的逻辑操作。一份PHP源文件应该要么就只包含不产生从属效应的定义操作,要么就包含只会产生从属效应的逻辑操作,切勿同时包含两者。

 

====================PSR-2(代码风格规范)=======================

PSR-2(Coding Style Guide)代码风格规范,通过制定一系列规范化PHP代码的规则,以减少因代作者码风格不同而造成的阅读不便。

1.代码必须遵循 PSR-1 中的编码规范

2.代码必须使用4个空格来进行缩进,而非制表符(TAB)

3.建议每行代码字符数保持在80个以内,理论上不可多于120个,但不做硬性限制

4.每个 namespace 命名空间语句和 use 声明语句块后面必须插入一个空白行

5.类的左花括号 "{" 必须写在声明后自成一行,右花括号 "}" 也必须在类主体下自成一行

6.方法的左花括号 "{" 必须放在声明后自成一行,右花括号 "}" 也必须于主体下自成一行

7.类的属性和方法必须添加访问修饰符(private、protected、public),abstract 以及 final 必须声明在访问修饰符之前,而 static 必须声明在访问修饰符之后(例:final public static)

8.在控制结构关键字的后面必须有一个空格,而调用方法或函数时一定不能有(控制结构:if-else、switch-case、try-catch、while、foreach ...)

9.控制结构的左花括号 "{" 必须跟其处于同一行,右花括号 "}" 必须在控制结构主体之后自成一行

10.控制结构的开始左括号之后,和结束右括号之前都不可以有空格

 

====================PSR-3(日志接口规范)=======================

PSR-3(Logger Interface)日志接口规范,主要目的是为了让日志类库通过接收一个 LoggerInterface 对象来记录日志信息。

1.LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debug、info、notice、warning、error、critical、alert、emergency

2.第九个方法 log(),第一个参数为记录等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量没有预先定义,则必须抛出 psr\Log\InvalidArgumentException 类型的异常。不推荐使用自定义的日志等级,除非你非常确定当前类库对其有所支持。

 

====================PSR-4(自动加载新规)=======================

PSR-4(Improved Autoloading)本规范是关于自动载入对应类的相关规范,是 PSR-0 自动加载规范的补充。

1.此处的“类”是一个泛称,它包含类、接口、traits 以及其他类似的结构

2.完全限定类名需要遵循以下结构:\<命名空间>(\<子命名空间>)*\<类名>

  * 完全限定类名必须要有一个顶级命名空间,被称为 "vendor namespace";

  * 完全限定类名可以有一个或多个子命名空间;

  * 完全限定类名必须有一个终止类名;

  * 完全限定类名中任意一部分中的下划线都没有特殊含义;

  * 完全限定类名可以由任意大小写字母组成;

  * 完全限定类名必须以大小写敏感的方式引用;

3.当根据完整的类名载入相应的文件时:

  * 完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录;

  * 紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符;

  * 终止类名对应一个以 .php 结尾的文件,文件名必须和终止类名大小写匹配;

4.自动加载器(autoloader)的实现不能抛出异常,不可引发任一级别错误,也不应该有返回值

PHP 编码规范

PHP 编码规范

一、文件格式

1. 对于只含有 php 代码的文件,我们将在文件结尾处忽略掉 "?>" 。这是为了防止多余的空格或者其它字符影响到代码。
例如:
<?php
$foo = ''foo'';
2. 缩进应该能够反映出代码的逻辑结果,尽量使用四个空格,禁止使用制表符 TAB,因为这样能够保证有跨客户端编程器软件的灵活性。
例如:
if (1 == $x) {
    $indented_code = 1;
    if (1 == $new_line) {
        $more_indented_code = 1;
    }
}
3. 变量赋值必须保持相等间距和排列。
例如:
$variable = ''demo'';
$var      = ''demo2'';
4. 每行代码长度应控制在 80 个字符以内,最长不超过 120 个字符。因为 linux 读入文件一般以 80 列为单位,就是说如果一行代码超过 80 个字符,那么系统将为此付出额外操作指令。这个虽然看起来是小问题,但是对于追求完美的程序员来说也是值得注意并遵守的规范。
5. 每行结尾不允许有多余的空格。

二、命名约定

1. 类文件都是以 “.class.php“为后缀,且类文件名只允许字母,使用驼峰法命名,并且首字母大写,例如:DbMysql.class.php 。
2. 配置和函数等其他类库文件之外的文件一般是分别以 “.inc.php “和”.php“为后缀,且文件名命名使用小写字母和下划线的方式,多个单词之间以下划线分隔,例如 config.inc.php , common.php,install_function.php 。
3. 确保文件的命名和调用大小写一致,是由于在类 Unix 系统上面,对大小写是敏感的。
4. 类名和文件名一致(包括上面说的大小写一致),且类名只允许字母,例如 UserAction 类的文件命名是 UserAction.class.php, InfoModel 类的文件名是 InfoModel.class.php 。
5. 控制器类以 Action 为后缀,例如 UserAction、InfoAction ,模型类以 Model 为后缀,例如 UserModel、InfoModel ,其他类也分别以相应分类为后缀,例如 Service 、Widget。
6. 方法名只允许由字母组成,下划线是不允许的,首字母要小写,其后每个单词首字母要大写,即所谓的 “驼峰法命名” 规则,且越详细越好,应该能够描述清楚该方法的功能,例如 switchModel、findPage。
7. 属性的命名只允许由字母组成,下划线是不允许的,首字母要小写,其后每个单词首字母要大写,即所谓的 “驼峰法命名” 规则,例如 tablePrefix、tableName 。
8. 对于对象成员的访问,我们必须始终使用 “get” 和 “set” 方法。例如:
class Foo
{
    protected $_testObj;
    public function getTestObj()

    {
        return $this->_testObj;
    }
    public function setTestObj($testObj)
    {
        $this->testObj = $_testObj;
    }
}
9. 当类成员方法被声明为 private 时,必须分别以双下划线 "__" 为开头;被声明为 protected 时,必须分别以单下划线 "_" 为开头;一般情况下的方法不含下划线。例如 :
class Foo
{
    private function __example()
    {
        // ...
    }
    protected function _example()
    {
        // ...
    }
    public function example()
    {
        // ...
    }
}
10. 如果我们需要把一些经常使用的方法定义为全局函数,那么应该把它们以静态 (static) 的形式定义在类中。例如:
class Think
{
    // ...
    static public function autoload($classname)

    {
        // ...
    }
}
11. 被声明为 private 的类成员属性必须由双下划线 "__" 作为开头;被声明为 protected 的类成员属性必须由下划线 "_" 作为开头;而声明为 public 的成员属性则在任何时候都不允许含有下划线。
12. 函数的命名使用小写字母和下划线的方式,且越详细越好,应该能够描述清楚该函数的功能,例如 get_client_ip 。
13. 当方法或函数参数不一定需要被赋值的时候,用 "null" 来代替 "false" 作为函数参数的默认值,除非该参数是 boolean 值。
14. 变量只允许由小写字母和下划线组成,且建议用描述性的变量的命名,越详细越好,以至于像 $i 或 $n 等等都是不鼓励使用的。
15. 类中的常量 constant 和全局范围内常量 define,只能由大写字母和下划线组成,各个单词之间以下划线分割。
16. boolean 值和 null 值都采用小写。

三、编码风格

1. php 代码必须以完整的形式来定界(<?php … ?>),即不要使用 php 短标签(<? … ?>),且保证在关闭标签后不要有任何空格。
2. 当一个字符串是纯文本组成的时候(即不含有变量),则必须总是以单引号('')作为定界符。例如:
$a = ''Example String'';
3. 变量替换中的变量只允许用 $+ 变量名 的形式。例如:
$greeting = "Hello $name, welcome back!";   // 允许
$greeting = "Hello {$name}, welcome back!"; // 允许
$greeting = "Hello ${name}, welcome back!"; // 不允许
 当用点号 "." 连接各字符串的时候,字符串与点号间必须用一个空格隔开,且允许把它分割成多行以增强可读性。在这种情况下,点号 "." 必须与等于号 "=" 对齐。例如:
$sql = "SELECT `id`, `name` " . " FROM `people` "
      . "WHERE `name` = ''Susan'' "
      . "ORDER BY `name` ASC ";
 当用 array 类型符号来构造数组的时候,必须在每个逗号之后加上一个空格来增强可读性。例如:$sampleArray = array (1, 2, 3, ''Think'', ''SNS'');
4. 当使用 array 类型符声明关联数组的时候,我们鼓励把它分成多个行,只是我们必须同时保证每行的键与值的对齐,以保持美观。例如:
$sampleArray = array(
                   ''firstKey''  => ''firstValue'',
                   ''secondKey'' => ''secondValue''
               );
5. 大括号的开始必须在类名的下一行顶格。例如:
class Think
{
    // ...
}
6. 类中的所有代码都必须用四个空格来进行缩进。
7. 每个 php 文件只允许声明一个类。在类文件里面写其它代码是允许的,但并不鼓励这样做。假如真要附加代码的话,必须用空行来分隔。
8. 任何类变量的声明都必须放在类顶部,先于任何函数的声明。
9. 不允许用 var 符号来声明变量,类成员变量必须以 private,protected 和 public 来声明。其次,把类成员声明为 public 而直接引用虽然是允许的,但通常更好的方法是使用 get 和 set 方法来访问类成员。
10. 方法必须总是用 private,protected 或者 public 来声明其作用域。
11. 静态 static 方法应该声明其作用域,且不应该再被声明为 private 私有,而应该为 protected 或者 public ,如果只是不想被子类继承,则应该用 final 声明它们。
12. 函数或方法的初始大括号应该在函数声明的下一行顶格。例如: 
function get_client_ip()
{
    // …
}
13. 在函数或方法名与参数括号之间不允许出现多余的空格。例如:
function get_client_ip()
{
    // …
}
14. 引用只允许定义在函数参数中,实时传递引用是禁止的。例如:
// 引用定义在函数参数 - 允许的
function defineRefInMethod(&$a)
{
    $a = ''a'';

defineRefInMethod($b);
echo $b; // ''a''
// 实时传递引用 - 禁止的
function callTimePassRef($a)
{
    $a = ''a'';
}
callTimePassRef(&$c);
echo $c; // ''a''
15. 函数或方法返回值不可以用括号包住,不然会降低可读性,而且假如以后函数修改为返回引用的话,这将会抛出一个异常。
16. 鼓励尽量使用类型提示,特别是在模块设计中。例如:
class Foo
{
    public function foo(SomeInterface $object)

   {
    }
    public function bar(array $options)
    {
    }
}
17. 函数和方法参数必须用逗号 + 空格来分隔。
18. 对于参数为数组的函数,参数中的数组应该分成多行以增强可读性。例如:
threeArguments(array(1, 2, 3), 2, 3);
threeArguments(array(1, 2, 3, ''Think'',
                    ''SNS'', $a, $b, $c,
                    56.44, $d, 500), 2, 3);
19.  基于 "if", "else" 和 "else if" 的条件控制里,我们必须用空格间隔开语句和括号,大括号的开始 "{" 必须与条件控制语句位于同一行,结束 "}" 必须总是独占一行且顶格,控制流程内容必须用四个空格进行缩进,且不使用 "elseif"。
if ($condition) {
    // ...
} else if ($_condition) {
    // ...
} else {
    // ...
}
20. 在条件控制语句的条件括号内,必须用空格将操作符与其它元素隔开。如果遇到很长的逻辑判断,则鼓励用内嵌括号来分割各个逻辑。例如:
if (($a != 2) and ($b == 1)) {
    $a = $b;
}
21. "switch" 条件控制语句中,必须用空格将待测参数与其它元素分隔开。例如:
switch ($num) {
    // …
}
22.  "switch" 语句的内容必须以四个空格缩进,"case" 条件控制的内容必须再加四个空格进行缩进。例如:
switch ($indentedSpaces) {
    case 2:
        echo "错误";
        break;
    case 4:
        echo "正确";
        break;
    default:
        break;
}
23. 在 "switch" 语句中应该总是包括 "default" 控制。
24. 有时候我们需要在 "case" 语境中省略掉 "break" 或 "return" ,这个时候我们必须为这些 "case" 语句加上 "// 此处无 break" 注释。例如:
switch ($numPeople) {
case 1: // 此处无 break
case 2:
      break;
default:
      break;
}

PHP 编码规范 (PSR-3)- 日志接口规范

PHP 编码规范 (PSR-3)- 日志接口规范

PSR-3 日志接口规范

本文制定了日志类库的通用接口规范。 本规范的主要目的,是为了让日志类库以简单通用的方式,通过接收一个 Psr\Log\LoggerInterface 对象,来记录日志信息。 框架以及 CMS 内容管理系统如有需要,可以对此接口进行扩展,但需遵循本规范, 这才能保证在使用第三方的类库文件时,日志接口仍能正常对接。 本文中的 实现者 指的是实现了 LoggerInterface 接口的类库或者框架,反过来讲,他们就是 LoggerInterface 的 使用者。

1. 规范说明

1.1 基本规范
  • LoggerInterface 接口对外定义了八个方法,分别用来记录 RFC 5424 中定义的八个等级的日志:debuginfonoticewarningerrorcriticalalert 以及 emergency
  • 第九个方法 —— log,其第一个参数为记录的等级。可使用一个预先定义的等级常量作为参数来调用此方法,必须与直接调用以上八个方法具有相同的效果。如果传入的等级常量参数没有预先定义,则必须抛出 Psr\Log\InvalidArgumentException 类型的异常。在不确定的情况下,使用者不该使用未支持的等级常量来调用此方法。
1.2 记录信息
  • 以上每个方法都接受一个字符串类型或者是有 __toString() 方法的对象作为记录信息参数,这样,实现者就能把它当成字符串来处理,否则实现者必须自己把它转换成字符串。
  • 记录信息参数可以携带占位符,实现者可以根据上下文将其它替换成相应的值。 其中占位符必须与上下文数组中的键名保持一致。 占位符的名称必须由一个左花括号 { 以及一个右括号 } 包含。但花括号与名称之间一定不能有空格符。 占位符的名称应该只由 A-Z、 a-z,0-9、下划线 _、以及英文的句号。组成,其它字符作为将来占位符规范的保留。 实现者可以通过对占位符采用不同的转义和转换策略,来生成最终的日志。 而使用者在不知道上下文的前提下,不该提前转义占位符。 以下是一个占位符使用的例子:
/**
* 用上下文信息替换记录信息中的占位符
*/
function interpolate($message, array $context = array())
{
  // 构建一个花括号包含的键名的替换数组
  $replace = array();
  foreach ($context as $key => $val) {
      $replace[''{'' . $key . ''}''] = $val;
  }

  // 替换记录信息中的占位符,最后返回修改后的记录信息。
  return strtr($message, $replace);
}

// 含有带花括号占位符的记录信息。
$message = "User {username} created";

// 带有替换信息的上下文数组,键名为占位符名称,键值为替换值。
$context = array(''username'' => ''bolivar'');

// 输出 "Username bolivar created"
echo interpolate($message, $context);
1.3 上下文
  • 每个记录函数都接受一个上下文数组参数,用来装载字符串类型无法表示的信息。它可以装载任何信息,所以实现者必须确保能正确处理其装载的信息,对于其装载的数据,一定不能 抛出异常,或产生 PHP 出错、警告或提醒信息(error、warning、notice)。
  • 如需通过上下文参数传入了一个 Exception 对象, 必须以 ''exception'' 作为键名。 记录异常信息是很普遍的,所以如果它能够在记录类库的底层实现,就能够让实现者从异常信息中抽丝剥茧。 当然,实现者在使用它时,必须确保键名为 ''exception'' 的键值是否真的是一个 Exception,毕竟它可以装载任何信息。
1.4 助手类和接口
  • Psr\Log\AbstractLogger 类使得只需继承它和实现其中的 log 方法,就能够很轻易地实现 LoggerInterface 接口,而另外八个方法就能够把记录信息和上下文信息传给它。
  • 同样地,使用 Psr\Log\LoggerTrait 也只需实现其中的 log 方法。不过,需要特别注意的是,在 traits 可复用代码块还不能实现接口前,还需要 implement LoggerInterface。
  • 在没有可用的日志记录器时, Psr\Log\NullLogger 接口可以为使用者提供一个备用的日志 “黑洞”。不过,当上下文的构建非常消耗资源时,带条件检查的日志记录或许是更好的办法。
  • Psr\Log\LoggerAwareInterface 接口仅包括一个 setLogger (LoggerInterface $logger) 方法,框架可以使用它实现自动连接任意的日志记录实例。
  • Psr\Log\LoggerAwareTrait trait 可复用代码块可以在任何的类里面使用,只需通过它提供的 $this->logger,就可以轻松地实现等同的接口。
  • Psr\Log\LogLevel 类装载了八个记录等级常量。

2. 包

上述的接口、类和相关的异常类,以及一系列的实现检测文件,都包含在 psr/log 文件包中。

3. Psr\Log\LoggerInterface

<?php

namespace Psr\Log;

/**
 * 日志记录实例
 *
 * 日志信息变量 —— message, **必须**是一个字符串或是实现了  __toString() 方法的对象。
 *
 * 日志信息变量中**可以**包含格式如 “{foo}” (代表foo) 的占位符,
 * 它将会由上下文数组中键名为 "foo" 的键值替代。
 *
 * 上下文数组可以携带任意的数据,唯一的限制是,当它携带的是一个 exception 对象时,它的键名 必须 是 "exception"。
 *
 * 详情可参阅: https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-3-logger-interface-cn.md
 */
interface LoggerInterface
{
    /**
     * 系统不可用
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function emergency($message, array $context = array());

    /**
     * **必须**立刻采取行动
     *
     * 例如:在整个网站都垮掉了、数据库不可用了或者其他的情况下,**应该**发送一条警报短信把你叫醒。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function alert($message, array $context = array());

    /**
     * 紧急情况
     *
     * 例如:程序组件不可用或者出现非预期的异常。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function critical($message, array $context = array());

    /**
     * 运行时出现的错误,不需要立刻采取行动,但必须记录下来以备检测。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function error($message, array $context = array());

    /**
     * 出现非错误性的异常。
     *
     * 例如:使用了被弃用的API、错误地使用了API或者非预想的不必要错误。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function warning($message, array $context = array());

    /**
     * 一般性重要的事件。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function notice($message, array $context = array());

    /**
     * 重要事件
     *
     * 例如:用户登录和SQL记录。
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function info($message, array $context = array());

    /**
     * debug 详情
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function debug($message, array $context = array());

    /**
     * 任意等级的日志记录
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return null
     */
    public function log($level, $message, array $context = array());
}

4. Psr\Log\LoggerAwareInterface

<?php

namespace Psr\Log;

/**
 * logger-aware 定义实例
 */
interface LoggerAwareInterface
{
    /**
     * 设置一个日志记录实例
     *
     * @param LoggerInterface $logger
     * @return null
     */
    public function setLogger(LoggerInterface $logger);
}

5. Psr\Log\LogLevel

<?php

namespace Psr\Log;

/**
 * 日志等级常量定义
 */
class LogLevel
{
    const EMERGENCY = ''emergency'';
    const ALERT     = ''alert'';
    const CRITICAL  = ''critical'';
    const ERROR     = ''error'';
    const WARNING   = ''warning'';
    const NOTICE    = ''notice'';
    const INFO      = ''info'';
    const DEBUG     = ''debug'';
}

参考文档

  • PSR-3 日志接口规范 (中文版)
  • PHP PSR-3 (英文版)

今天关于PHP 编码规范(21)php编码规范有哪些的讲解已经结束,谢谢您的阅读,如果想了解更多关于PHP - 编码规范 v1.0、php psr 编码规范(PSR-[0-4])、PHP 编码规范、PHP 编码规范 (PSR-3)- 日志接口规范的相关知识,请在本站搜索。

本文标签: