php开发规范

PSR-[0-4]

  • PSR —— Proposing a Standards Recommendation
  • PSR-0 (Autoloading Standard) 自动加载标准
  • PSR-1 (Basic Coding Standard) 基础编码标准
  • PSR-2 (Coding Style Guide) 编码风格向导
  • PSR-3 (Logger Interface) 日志接口
  • PSR-4 (Improved Autoloading) 自动加载的增强版,可以替换掉PSR-0了。

PSR-1

  1. PHP源文件必须只使用 <?php 和 <?= 这两种标签。
  2. 源文件中php代码的编码格式必须是不带字节顺序标记(BOM)的UTF-8。
  3. 一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
  4. 命名空间(namespace)和类(class) 必须遵守PSR-0标准。
  5. 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
  6. 类(class)中的常量必须只由大写字母和下划线(_)组成。
  7. 方法名(method name) 必须使用驼峰式(cameCase)写法。

PSR-2

  • 文件末尾必须空一行。
  • 必须使用Unix LF(换行)作为行结束符。
  • 纯PHP代码源文件的关闭标签?>必须省略。
  • 缩进必须使用4个空格来缩进
  • 一行推荐的是最多写80个字符
  • php的关键字,必须小写,boolean值:true,false,null 也必须小写
  • 命名空间
    • 命名空间(namespace)的声明后面必须有一行空行。
    • 所有的导入(use)声明必须放在命名空间(namespace)声明的下面。
    • 一句声明中,必须只有一个导入(use)关键字。
    • 在导入(use)声明代码块后面必须有一行空行。
<?php
namespace Lib\Databases;  // 下面必须空格一行
 
use FooInterface;  //use 必须在namespace 后面声明
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass; //  下面必须空格一行
 
class Mysql
{
}
  • extends, implement 必须和 class name 写在一行,切花括号要换行写。
<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{ //换行写{
}
  • 属性(property)必须声明其可见性,到底是 public 还是protected还是 private,不能省略
  • 方法(method) ,必须 声明其可见性,到底是 public 还是protected还是 private,不能省略。花括号{必须换行写。如果有多个参数,第一个参数后紧接, ,再加个空格,且函数name和( 之间必须要有个空格:function_name($par, $par2, $pa3), 如果参数有默认值,也要用左右空格分开
<?php
namespace Lib\Databaes;
 
class Mysql extends ParentClass implements \PDO, \DB // 写一行
{
    public getInfo($name, $age, $gender = 1) //函数名getInfo和(之间有个空格,参数之间也要有空格。默认参数也要左右都有空格
    { //必须换行写{
    }
}
  • 当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面
<?php
namespace Vendor\Package;
 
abstract class ClassName
{
    protected static $foo; //static放后面
    abstract protected function zim(); //abstract放前面
    final public static function bar() //final放前面,static放最后。
    {
        // 方法主体部分
    }
}
 
  • 函数调用
    • 括号前后不要有空格
    • 逗号前不要空格, 逗号后加空格
    • 多行参数书写, 第一个参数需换行, 且每行一个参数 <?php bar(); $foo->bar($arg1); Foo::bar($arg2, $arg3); <?php $foo->bar( $longArgument, $longerArgument, $muchLongerArgument );
  • 控制结构
    <?php
     
    if ($expr1) { //左右空格
        // if body
    } elseif ($expr2) { //elesif 连着写
        // elseif body
    } else {
        // else body;
    }
    

     

    <?php
     
    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;
    }
    
 
<?php
 
while ($expr) { //左右空格
    // structure body
}
do {
    // structure body;  //左右空格
} while ($expr);

 

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

 

<?php
 
foreach ($iterable as $key => $value) { //还是空格问题
    // foreach body
}

 

<?php
 
try {
    // try body
} catch (FirstExceptionType $e) { //同样也是注意空格。
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}
 
    • 闭包

<?php
 
closureWithArgs = function($arg1, $arg2) {
    // body
};
closureWithArgsAndVars = function($arg1, arg2) use($var1, $var2) {
    // body
};
<?php
 
 
$longArgs_noVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) {
    // body
};

 

<?php
 
 
$noArgs_longVars = function () use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};

 

<?php
 
 
$longArgs_longVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};

 

<?php
 
 
$longArgs_shortVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use ($var1) {
    // body
};

 

<?php
 
 
$shortArgs_longVars = function ($arg) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
    // body
};
 
 
 
 
 

PSR-3

  • 日志接口

PSR-4

    • autoload相关
    • 此处的“类”泛指所有的class类、接口、traits可复用代码块以及其它类似结构。
    • 一个完整的类名需具有以下结构:

      \<命名空间>(\<子命名空间>)*\<类名>
    • 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace";
    • 完整的类名可以有一个或多个子命名空间;
    • 完整的类名必须有一个最终的类名;
    • 完整的类名中任意一部分中的下滑线都是没有特殊含义的;
    • 完整的类名可以由任意大小写字母组成;
    • 所有类名都必须是大小写敏感的。
    • 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应;
    • 紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符。
    • 末尾的类名必须与对应的以 .php 为后缀的文件同名。
    • 自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。
posted @ 2019-05-24 19:17  pengcx  阅读(404)  评论(0编辑  收藏  举报