PHP Standard Recommendations【php 标准规范】
PSR-0:自动加载标准
已经被 PSR-4 替代,可以了解下
1. 强制:完全限定命名空间和类的格式:\<Vendor Name>\(<Namespace>\)*<Class Name>
2. 强制:每个命名空间必须有一个顶级命名空间 (Vendor Name)。
3. 每个命名空间中可以含有任意数量的子命名空间。
4. 当文件系统加载源文件时,命名空间之间的分隔符被转换为 DIRECTORY_SEPARATOR。
5. 类名<Class Name>中的下划线 _ 都被转换为 DIRECTORY_SEPARATOR。_ 没有什么特殊的意义。
6. 完全限定命名空间和类从文件系统加载源文件时会加上 .php 后缀。
7. 完全限定命名空间中的字母大小写可以是任何组合。
实例
\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
PSR-4 自动加载
class 指的是 classes, interfaces, traits 和其他相似结构。
完全限定类名格式:\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>。
注意:psr4 后不再叫完全限定命名空间,而是完全限定类名。
1. 完全限定类名必须有一个顶级命名空间名称,也称 "vendor namespace"。
2. 完全限定类名可以有有一个或多个子命名空间。
3. 完全限定类名必须有一个最终的类名;
4. 下划线都是没有特殊含义的
5. 完全限定类名可以由任意大小写字母组成;
6. 所有类名必须以区分大小写的方式引用。
7. 完全限定类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,称为“命名空间前缀”,其必须与至少一个“文件基目录”相对应;
8. 紧接命名空间前缀后的子命名空间必须与相应的文件“基目录”的子目录相匹配,其中的命名空间分隔符将作为目录分隔符。
9. 末尾的类名必须与对应的以 .php 为后缀的文件同名(大小写敏感)。
10. 自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。
实例
完整类名 | 命名空间前缀 | 文件基目录 | 文件路径 |
---|---|---|---|
\Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
PSR-1:基本编程规范
1. 文件标签必须是 <?php 或者 <?= 。
2. 文件必须以不带BOM的 UTF-8 编码
3. 文件中的代码应该只能是定义类、函数、常量等声明,或者只能是一些副操作,如生成输出,改变 .ini 设置等。
4. 命名空间和类必须满足 psr0 或者 psr4。
5. 类名必须是 StudlyCaps 【大写开头的驼峰命名】规范。
6. 类中常量所有字母必须大写,下划线分隔。
7. 方法名称必须是 camelCase 驼峰命名规范。
解释
副操作包含却不仅限于:生成输出、直接的 require 或 include、连接外部服务、
修改 ini 配置、抛出错误或异常、修改全局或静态变量、读或写文件等。
<?php
// side effect: change ini settings
ini_set('error_reporting', E_ALL);
// side effect: loads a file
include "file.php";
// side effect: generates output
echo "<html>\n";
// declaration
function foo()
{
// function body
}
<?php
// declaration
function foo()
{
// function body
}
// conditional declaration is not a side effect
if (! function_exists('bar')) {
function bar()
{
// function body
}
}
PSR-2 编程风格规范
被 PSR-12 取代了。
PSR-12 编程风格规范
<?php
declare(strict_types=1);
namespace Vendor\Package;
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;
use function Vendor\Package\{functionA, functionB, functionC};
use const Vendor\Package\{ConstantA, ConstantB, ConstantC};
class Foo extends Bar implements FooInterface
{
public function sampleFunction(int $a, int $b = null): array
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
final public static function bar()
{
// method body
}
}
- 换行必须是 Unix LF(linefeed)。
- 所有PHP文件都必须以非空行结尾,并以单个 LF 终止。
- 在仅包含PHP的文件中,必须省略 ?> 标记。
- 行长度必须不能有硬性限制。
- 行长的软限制必须为 120 个字符。
- 行数不能超过80个字符; 长于该行的行应分成多行,每行不超过80个字符。
- 行尾一定不能有尾随空格。
- 除非明确禁止,否则可以添加空行以提高可读性并指示相关的代码块。
- 每行不得超过一个语句。
- 代码必须为每个缩进级别使用 4 个空格的缩进,并且不得使用制表符进行缩进。
- 所有 PHP 保留的关键字和类型、均必须小写。
- 添加到将来的 PHP 版本中的任何新类型和关键字都必须小写。
- 必须使用类型关键字的缩写形式,即 bool 代替 boolean,int 代替 integer 等。
PHP 文件的头可能包含许多不同的块。如果存在,则下面的每个块都必须由单个空白行分隔,并且不得包含空白行。每个块都必须按照下面列出的顺序进行。
<?php 标签。
文件级文档块。
一个或多个声明语句。
文件的命名空间声明。
一个或多个基于类的 use 导入语句。
一个或多个基于函数的 use 导入语句。
一个或多个基于常量的 use 导入语句。
文件中的其余代码。
也适用于 HTML 和 PHP 混合文件。
<?php
/**
* This file contains an example of coding styles.
*/
declare(strict_types=1);
namespace Vendor\Package;
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;
use Vendor\Package\AnotherNamespace\ClassE as E;
use function Vendor\Package\{functionA, functionB, functionC};
use function Another\Vendor\functionD;
use const Vendor\Package\{CONSTANT_A, CONSTANT_B, CONSTANT_C};
use const Another\Vendor\CONSTANT_D;
/**
* FooBar is an example class.
*/
class FooBar
{
// ... additional PHP code ...
}
// 深度不得超过两个的复合命名空间。
use Vendor\Package\SomeNamespace\{
SubnamespaceOne\ClassA,
SubnamespaceOne\ClassB,
SubnamespaceTwo\ClassY,
ClassZ,
};
// 下面的不行
<?php
use Vendor\Package\SomeNamespace\{
SubnamespaceOne\AnotherNamespace\ClassA,
SubnamespaceOne\ClassB,
ClassZ,
};
<?php declare(strict_types=1) ?>
<html>
<body>
<?php
// ... additional PHP code ...
?>
</body>
</html>
declare(ticks=1) {
// some code
}
太多了。。。 贴个链接,你们玩的开心。。。