psr2编码样式

代码必须遵循PSR-1

代码必须使用4个空格作为缩进,不能使用TABs

每行长度不是硬性限制的,必须孔子在120个字符,最好应该不超过80个字符

在声明命名空间后必须有一个空行,同时必须在 引用“use”块后有一个空行

引用声明(use)块必须在命名空间声明后

<?php
namespace Vendor\Package;
[---声明命名空间后的空行---]
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
[--其他类引用块后的空行--]
class Foo extends Bar implements FooInterface
{  [--类的开始大括号必须新起一行--]
    public function sampleMethod($a, $b = null)
    {[--方法的开始大括号必须新起一行--]
        if ($a === $b) {[--程序结构体的开始大括号必须在同一行,开始括号后,结束括号前都没有空格--]
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2, $arg3);
        } [--程序结构体结束大括号必须单独起一行--]
    }[--方法的结束大括号必须新起一行--]

    final public static function bar() [--可见性在static前,final和abstract在可见性前]
    { 
        // method body
    }
}[--类的结束大括号必须新起一行--]

类的大括号开始必须在下一行,关闭大括号必须是在类的最后单独一行

方法的大括号开始必须在下一行,关闭大括号必须是在方法的最后单独一行

必须声明所有方法和属性的可见性(public/protected/private),abstrat(抽象) 和 final(无法被继承的)必须在可见性前声明,static(静态)必须在可见性后声明

流程控制结构关键字后面必须有一个空格;方法和函数调用后面不能有空格

流程控制的开始大括号不行在同一行,关闭结束大括号必须在流程控制体的最后单独一行

流程控制结构后开始括号后以及结束关闭括号前都不能有空格

PHP关键字必须是小写:true,false,null

关键字extends 和 implements 必须和类名在同一行

implements(类似多继承)可以被分割成多行,后面每行都要缩进一次, 一行只能有一个interface

样式1 ok:
<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}

样式2 ok:
<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
    // constants, properties, methods
}

样式3:WRONG

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,\Serializable
{
    // constants, properties, methods
}

样式4:WRONG

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements \Serializable,
    \ArrayAccess,
    \Countable
{
    // constants, properties, methods
}

关键字 var 不能用于声明一个属性,一行不能声明多个属性,属性名不应以下划线为前缀来表示受保护或私有的可见性。

多个方法参数和后面的逗号之间不能有空格;在每个逗号后面都必须有一个空格;如果参数列表必须分割成多行时,每行都有一个缩进,一旦这样做,第一个参数必须新起一行,每行必须有一个参数 右括号在参数后新起一行,并和方法做大括号在同一行

示例1 ok:
<?php
namespace Vendor\Package;

class ClassName
{
    public function foo($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}

示例2 ok:

<?php
namespace Vendor\Package;

class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) {
        // method body
    }
}

示例3 WRONG:
<?php
namespace Vendor\Package;

class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) 
    {
        // method body
    }
}

示例4 WRONG:
<?php
namespace Vendor\Package;

class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = [] )
     {
        // method body
    }
}

示例5 WRONG:
<?php
namespace Vendor\Package;

class ClassName
{
    public function aVeryLongMethodName(
    ClassTypeHint $arg1,
    &$arg2,
    array $arg3 = [] 
     ){
        // method body
    }
}

调用一个行数和方法时候在操作符和函数方法名之间不能有空格,同样在第一个参数前,最后一个参数后都不能有空格;如果参数是多行话,同样是从第一个参数开始新起一行,一次缩进,每行一个参数。

几种程序结构标准格式

if elseif else

<?php
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
} else {
    // else body;
}

switch,case:

<?php
switch ($expr) {
    case 0:
        echo 'First case, with a 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;
}

while:
<?php
while ($expr) {
    // structure body
}

do while:

<?php
do {
    // structure body;
} while ($expr);

for:
<?php
for ($i = 0; $i < 10; $i++) {
    // for body
}

foreach
<?php
foreach ($iterable as $key => $value) {
    // foreach body
}

try, catch
<?php
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}

闭包中每个参数一行,匿名函数中 function后和use前后空格

<?php
$foo->bar(
    $arg1,
    function ($arg2) use ($var1) {
        // body
    },
    $arg3
);

猜你喜欢

转载自erntoo.iteye.com/blog/2367130