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
- 손가락귀신
정신 못차리면, 벌 받는다.