PSR-2

Programming/PHP 2016. 2. 18. 23:20

PSR-2 : 코드 스타일 가이드 (http://www.php-fig.org/psr/psr-2/)


PSR-1 코딩 스타일의 확장판이다.


<?php
namespace Vendor\Package;
 
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
class Foo extends Bar implements FooInterface
{
    public function sampleFunction($a$b = null)
    {
        if ($a === $b) {
            bar();
        } elseif ($a > $b) {
            $foo->bar($arg1);
        } else {
            BazClass::bar($arg2$arg3);
        }
    }
 
    final public static function bar()
    {
        // method body
    }
}
cs



Basic Coding Standard


PSR-1 에 명시된 모든 코딩 스타일 가이드를 준수해야 한다.



Files


라인 끝은 Unix LF (linefeed) 를 사용해야 한다.

파일의 끝은 한 줄을 띄고 마지막 ?> 태그는 생략해야 한다.



Lines


한 줄에 soft 길이 제한은 120 자가 되어야 한다; 자동 스타일 체커 (경고여야지 에러로 출력하지 말아야 한다.)

한 줄에 너무 길지 않도록 80 자 정도만 사용하고 80 자 이상은 다음 줄로 분리하도록 한다.

라인의 끝에 공백을 두지 않는다.

가독성과 코드 블럭을 가리키기 위해 빈 라인을 사용할 수 있다.

한 줄에 하나 이상의 구문을 사용하지 않아야 한다.



Indenting


들여쓰기는 스페이스 4칸을 사용하고, 탭은 사용하지 않아야 한다.



Keywords and True/False/Null


PHP 키워드나 상수 true, false, null 등은 모두 소문자로 사용해야 한다.



Namespace and Use Declarations


namespace 나 use 블럭을 선언하고는 한 줄을 띄어야 한다.

모든 use 선언은 namespace 다음에 와야 한다.

use 키워드는 선언 하나 당 하나씩만 사용해야 한다.


<?php
namespace Vendor\Package;
 
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
// ... additional PHP code ...
cs



Extends and Implements


extends 와 implements 키워드는 클래스 이름과 같은 줄에 선언되어야 한다.

implements 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있다.

class 와 method 의 시작 중괄호는 다음 줄에 와야 하고, 끝 중괄호도 본문 끝의 다음 줄에 와야 한다.


<?php
namespace Vendor\Package;
 
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
 
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}
cs


<?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
}
cs



Properties


가시성(Visibility) 은 모든 property 에 선언되어야 한다.

var 키워드는 property 선언으로 사용하지 않아야 한다.

구문 당 하나 이상의 property 를 선언하지 않아야 한다.

property 의 이름에 protected 나 private 를 가리키는 _(underscore) 접두어를 사용하지 않는 것이 좋다.


<?php
namespace Vendor\Package;
 
class ClassName
{
    public $foo = null;
}
cs



Method


가시성(Visibility) 은 모든 method 에 선언되어야 한다.

property 의 이름에 protected 나 private 를 가리키는 _(underscore) 접두어를 사용하지 않는 것이 좋다.

method 이름 뒤에 공백과 함께 선언하지 말아야 한다.

method 의 시작 중괄호는 다음 줄에 와야 하고, 끝 중괄호도 본문 끝의 다음 줄에 와야 한다.

시작 괄호는 다음에 공백을 갖지 않아야 하고, 끝 괄호 전에 공백을 갖지 않아야 한다.


<?php
namespace Vendor\Package;
 
class ClassName
{
    public function fooBarBaz($arg1, &$arg2$arg3 = [])
    {
        // method body
    }
}
cs



Method Arguments


매개변수 리스트에서 각 콤마(,)의 앞에는 공백이 없어야 하고, 뒤에는 공백이 있어야 한다.

매개변수 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있으며, 이 경우 닫힘 괄호와 시작 중괄호는 같은 줄에 위치한다.


<?php
namespace Vendor\Package;
 
class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) {
        // method body
    }
}
cs



abstract, final, and static


abstract 와 final 은 가시성 전에 선언되어야 하고, static 은 가시성 뒤에 선언되어야 한다.


<?php
namespace Vendor\Package;
 
abstract class ClassName
{
    protected static $foo;
 
    abstract protected function zim();
 
    final public static function bar()
    {
        // method body
    }
}
cs



Method and Function Calls


메소드나 함수를 호출시, 시작 괄호와 끝 괄호의 앞, 뒤에 공백이 없어야 한다.

매개변수 리스트에서 각 콤마 앞에 공백이 없어야 하고, 콤파 뒤에 공백 한칸이 있어야 한다.

매개변수 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있으며, 한 줄에 하나의 매개변수만 있어야 한다.


<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2$arg3);
cs


<?php
$foo->bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument
);
cs



Control Structures


제어문 키워드는 뒤에 한칸 공백이 와야 한다.

시작 괄호는 다음에 공백을 갖지 않아야 하고, 끝 괄호 전에 공백을 갖지 않아야 한다.

끝 괄호와 시작 중괄호 사이에 공백 한칸이 있어야 한다.

제어문의 본문은 한번의 들여쓰기를 해야 한다.

끝 중괄호는 본문 끝의 다음 줄에 와야 한다.

제어문의 본문은 중괄호로 감싸야 한다.


모든 제어문은 한 단어로 사용하는 것이 좋다. else if(x) elseif(o)

case 의 break; 는 case 본문과 동일한 레벨의 들여쓰기를 해야 한다.

case 의 본문이 비어있지 않을 때 break 없이 진행해야 한다면 // no break 식의 주석을 달아야 한다.


<?php
if ($expr1) {
    // if body
} elseif ($expr2) {
    // elseif body
else {
    // else body;
}
 
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 ($expr) {
    // structure body
}
 
do {
    // structure body;
while ($expr);
 
for ($i = 0$i < 10$i++) {
    // for body
}
 
foreach ($iterable as $key => $value) {
    // foreach body
}
 
try {
    // try body
} catch (FirstExceptionType $e) {
    // catch body
} catch (OtherExceptionType $e) {
    // catch body
}
 
cs



Closures


클로저 선언시 function 키워드 다음에 공백이 한칸 와야 하고, use 키워드 앞, 뒤로 공백이 한칸 와야 한다.

시작 중괄호는 같은 줄에 와야 하고 끝 중괄호는 본문의 다음 줄에 와야 한다.

매개변수 리스트나 변수 리스트의 시작 괄호 다음에 공백이 없어야 하고, 끝 괄호 전에도 공백이 없어야 한다.

매개변수 리스트나 변수 리스트의 각 콤마 전에 공백이 있으면 안되고, 콤바 뒤에는 공백이 한칸 있어야 한다.

기본 값을 가진 클로저 매개변수는 매개변수 리스트의 끝에 와야 한다.

매개변수 리스트나 변수 리스트는 한번의 들여쓰기와 함께 여러 행에 걸쳐 분리될 수 있으며, 이 경우 닫힘 괄호와 시작 괄호/중괄호는 같은 줄에 위치한다.


<?php
$closureWithArgs = function ($arg1$arg2) {
    // body
};
 
$closureWithArgsAndVars = function ($arg1$arg2) use ($var1$var2) {
    // body
};
cs


<?php
$longArgs_noVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) {
   // body
};
 
$noArgs_longVars = function () use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
   // body
};
 
$longArgs_longVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
   // body
};
 
$longArgs_shortVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument
) use ($var1) {
   // body
};
 
$shortArgs_longVars = function ($arg) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
   // body
};
cs


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




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,