关于PSR(Proposing a Standards Recommendation)
PSR是由PHP-FIG(PHP Framework Interoperability Group)小组发起的非官方标准,详细的看这里PHP-FIG FAQ
PSR-0: 自动加载标准(Autoloader Standard)
要求
- 一个完整的命名空间必须是以下结构
\<Vendor Name>\(<Namespace>\)*<Class Name>
- 每个命名空间都必须拥有顶级域
(Vendor Name)
- 命名空间分隔符在加载对应文件时必须转换为
DIRECTORY_SEPARATOR
- 类名中的
_
转换成DIRECTORY_SEPARATOR
,命名空间中的下划线无特殊含义 - 命名空间对应的文件必须以.
php
来加载 - 使用命名空间时按照字母排序
演示
\Symfony\Core\Request => /path/Symfony/Core/Request.php
\Zend\Acl => /path/Zend/Acl.php
\Zend\Mail\Message => /path/Zend/Mail/Message.php
\Doctrine\Common\IsolatedClassLoader => /path/Doctrine/Common/IsolatedClassLoader.php
\Foo\Bar\Baz_Qux => /path/Foo/Bar/Baz/Qux.php
\Foo\Bar_Baz\Qux_Sample => /path/Foo/Bar_Baz/Qux/Sample.php
PSR-0实现
<?php
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = $namespace = '';
if($lastNsPos = strripos($className, '\\'))
{
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
PSR-1: 基本编码标准 (Basic Coding Standard)
要求
- PHP文件中只能使用
<?php
和<?
标签 - 文件必须使用
无BOM UTF-8
编码 - 一个文件要么定义符号表(类, 方法, 常量等),要么做一些引起副作用的事情(产生输出, 改变.ini文件设置等), 但是不应该两样都做 (感谢@windk)
- 命名空间以及类必须遵守PSR-0
- 类名必须以大写开头的驼峰式规则命名
StudlyCaps
- 类中的常量必须以大写字母命名,以下划线分割
- 方法必须以小写开头的驼峰式规则命名
camelCase
类名命名的规则适用于 interface, trait
演示
// 类名
class Foo
// 类常量
const VERSION = '1.0';
// 方法
public function actionBar()
PSR-2: 编码规范(Coding Style Guide)
主要有以下几点要求
- 必须遵守PSR-1标准
- 必须使用4个空格缩进,而非tab
- namespace和use关键字下必须空一行
- 方法声明必须拥有可见性描述符,abstract和final在可见性描述符之前,static在可见性描述符之后
- 控制结构中花括号
- 所有PHP文件必须使用 Unix LF 作为结束
- 不能用?>结束标签
- 非空白行末端不能有空白符
- PHP关键字必须小写
原文很长我就没有全部列出来,想要了解的可查看原文
PSR-2演示
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
public $foo = null; // 声明时赋初值
private $bar = null;
// 参数后有空格
final public static function sampleFunction($a, $b = null)
{ // 花括号单独一行
if ($a === $b) { // 括号两边有空格
return 0;
} elseif ($a > $b) { // 花括号与if一行
return $a - $b;
} else {
return BazClass::bar($a, $b);
}
}
// 控制结构
abstract protected function sampleControl()
{
switch ($expr) {
case 0:
echo '.....';
break;
default:
echo 'Default';
break;
}
while ($expr) {
}
do {
} while($expr);
for ($i = 0, $i < 10; $i++) {
}
foreach($iterable as $key => $value) {
}
try {
} catch(Exception $e) {
} finally {
}
}
// 闭包
public function sampleClosure()
{
// 括号两边有空格
$foo = function ($arg1, $arg2) {
};
$foo = function ($arg1, $arg2) use ($a, $b) {
};
}
}