PHP中PSR[0-4]代码规范

php-fig

1、FIG:PSR[0-4]代码规范的得发明者、规范者,framework interoperability group

2、PSR:提出标准建议,proposing a standards recommendation

PSR-0 Autoloading Standard

规范一

一个完全合格的namespace和class必须符合这样的结构:"< Vendor Name>(< Namespace>)*< Class Name>"

例如:\China\Jiangxi\School\User.php

China 表示Vendor Name

\Jiangxi\Scholl 表示Namespace

User 表示Class Name

规范二

每个namespace必须有一个顶层namespace

例如:\China\Jiangxi\School\User.php

China 为顶层namespace

规范三

namespace可以有多个子命名空间

例如:\China\Jiangxi\School和\China\Jiangxi\Family

School 和 Family 为\China\Jiangxi的子命名空间

规范四

文件系统加载时,每个namespace的分隔符要转换成DIRECTORY_SEPARATOR(目录分隔符)

例如:\China\Jiangxi\School和\China\Jiangxi\Family

School 和 Family 为\China\Jiangxi的子命名空间

规范五

在类名中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(特殊)意义的

已经弃用

规范六

文件后缀必须为.php

规范七

vendor name、namespaces、class名可以由大小写组成,且区分字母大小写

PSR-1 Basic Coding Stantard

规范一

php源文件必须只使用

规范二

源文件必须为不带字节顺序标记(BOM)的UTF-8

规范三

一个源文件建议只做声明(class、function、const)或者只做一些引起副作用的操作(输出信息、修改.ini配置等),不建议同时做这两件事

规范四

命名空间和类必须遵循PSR-0

规范五

类名必须使用骆驼式写法(ClassName)

规范六

类中的常量必须只由大写字母和下划线组成

规范七

方法名必须使用驼峰式写法(functionName)

PSR-2 Coding Style Guide

源文件

1、文件末尾必须空一行

2、必须使用Unix LF(换行)作为行结束符

3、纯PHP代码的源文件的关闭标签?>必须省略()

缩进

必须使用4个空格来缩进

一行推荐的是最多写80个字符,多于这个字符就应该换行了,一般的编辑器是可以设置的

关键字和 True/False/Null

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'

命名空间、namespace导入

1、命名空间声明之后,必须有一行空行

2、所有的导入(use)必须放在命名空间后面

3、在导入(use)声明代码块后面必须有一行空行


namespace Lib\Databases; // 下面必须空格一行

use FooInterface; // use 必须在namespace 后面声明

use BarClass as Bar;

use OtherVendor\OtherPackage\BazClass; // 下面必须空格一行

class Mysql

{

}

类(class),属性(property)和方法(method)

1、继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写


namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 写一行

{ // 换行写{

}

2、属性(property)必须声明其可见性,到底是 public 还是 protected 还是 private,不能省略,也不能使用var, var是php老版本中的什么方式,等用于public


namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 写一行

{

public $foo = null;

private $name = 'yangyi';

protected $age = '17';

}

3、方法(method),必须 声明其可见性,到底是 public 还是 protected 还是 private,不能省略。并且,花括号{必须换行写。如果有多个参数,第一个参数后紧接, ,再加个空格,且函数name和( 之间必须要有个空格:function_name ($par, $par2, $pa3), 如果参数有默认值,也要用左右空格分开


namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 写一行

{

public getInfo ($name, $age, $gender = 1) // 函数名getInfo和(之间有个空格,参数之间也要有空格。默认参数也要左右都有空格

{ // 必须换行写 {

}

}

4、当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面


namespace Vendor\Package;

abstract class ClassName

{

protected static $foo; // static放后面

abstract protected function zim(); // abstract放前面

final public static function bar() // final放前面,static放最后。

{

// 方法主体部分

}

}

控制结构

1、if,elseif,else写法


if ($expr1) { // 左右空格

// if body

} elseif ($expr2) { // elesif 连着写

// elseif body

} else {

// else body;

}

2、switch,case 注意左右空格和换行


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;

}

3、while,do while 的写法


while ($expr) { // 左右空格

// structure body

}

do {

// structure body; // 左右空格

} while ($expr);

4、for的写法


for ($i = 0; $i < 10; $i++) { // 注意几个参数之间的空格

// for body

}

5、foreach的写法


foreach ($iterable as $key => $value) { // 还是空格问题

// foreach body

}

6、try catch的写法


try {

// try body

} catch (FirstExceptionType $e) { // 同样也是注意空格。

// catch body

} catch (OtherExceptionType $e) {

// catch body

}

Logger Interface 规范日志接口

LoggerInterface


namespace Psr\Log;

/**

* Describes a logger instance

*

* The message MUST be a string or object implementing __toString().

*

* The message MAY contain placeholders in the form: {foo} where foo

* will be replaced by the context data in key "foo".

*

* The context array can contain arbitrary data, the only assumption that

* can be made by implementors is that if an Exception instance is given

* to produce a stack trace, it MUST be in a key named "exception".

*

* See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md

* for the full interface specification.

*/

interface LoggerInterface

{

/**

* System is unusable.

*

* @param string $message

* @param array $context

* @return null

*/

public function emergency($message, array $context = array());

/**

* Action must be taken immediately.

*

* Example: Entire website down, database unavailable, etc. This should

* trigger the SMS alerts and wake you up.

*

* @param string $message

* @param array $context

* @return null

*/

public function alert($message, array $context = array());

/**

* Critical conditions.

*

* Example: Application component unavailable, unexpected exception.

*

* @param string $message

* @param array $context

* @return null

*/

public function critical($message, array $context = array());

/**

* Runtime errors that do not require immediate action but should typically

* be logged and monitored.

*

* @param string $message

* @param array $context

* @return null

*/

public function error($message, array $context = array());

/**

* Exceptional occurrences that are not errors.

*

* Example: Use of deprecated APIs, poor use of an API, undesirable things

* that are not necessarily wrong.

*

* @param string $message

* @param array $context

* @return null

*/

public function warning($message, array $context = array());

/**

* Normal but significant events.

*

* @param string $message

* @param array $context

* @return null

*/

public function notice($message, array $context = array());

/**

* Interesting events.

*

* Example: User logs in, SQL logs.

*

* @param string $message

* @param array $context

* @return null

*/

public function info($message, array $context = array());

/**

* Detailed debug information.

*

* @param string $message

* @param array $context

* @return null

*/

public function debug($message, array $context = array());

/**

* Logs with an arbitrary level.

*

* @param mixed $level

* @param string $message

* @param array $context

* @return null

*/

public function log($level, $message, array $context = array());

}

Psr\Log\LoggerAwareInterface


namespace Psr\Log;

/**

* Describes a logger-aware instance

*/

interface LoggerAwareInterface

{

/**

* Sets a logger instance on the object

*

* @param LoggerInterface $logger

* @return null

*/

public function setLogger(LoggerInterface $logger);

}

Psr\Log\LogLevel


namespace Psr\Log;

/**

* Describes log levels

*/

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';

}

Autoloader

类名必须要和对应的文件名要一模一样,大小写也要一模一样

类文件名要以 .php 结尾

废除了PSR-0中就是目录分割符的写法,下划线在完全限定类名中是没有特殊含义

实例

FULLY QUALIFIED CLASS NAMENAMESPACE PREFIXBASE DIRECTORYRESULTING FILE PATH

\Acme\Log\Writer\File_WriterAcme\Log\Writer./acme-log-writer/lib/./acme-log-writer/lib/File_Writer.php

\Aura\Web\Response\StatusAura\Web/path/to/aura-web/src//path/to/aura-web/src/Response/Status.php

\Symfony\Core\RequestSymfony\Core./vendor/Symfony/Core/./vendor/Symfony/Core/Request.php

\Zend\AclZend/usr/includes/Zend//usr/includes/Zend/Acl.php

你可能感兴趣的:(PHP中PSR[0-4]代码规范)