PSR-12 을(를) 대안으로 사용할 수 있습니다.
이 문서는 “기본 코딩 표준” PSR [PSR-1] 을(를) 확장하고 확대한 것입니다.
이 문서의 목적은 다른 작성자가 작성한 코드를 읽을 때 혼란을 방지하고 더 쉽게 이해할 수 있도록 돕는 것입니다. 이를 위해 PHP 코드 서식에 대하여 공유된 규칙과 기대치를 나열합니다.
스타일 규칙은 이 문서와 관련된 다양한 프로젝트 멤버들 간의 공통점에서 파생되었습니다. 여러 작성자가 여러 프로젝트에서 공동으로 작업하는 경우 모든 프로젝트에서 사용할 수 있는 하나의 지침을 갖는 것이 도움이 될 수 있습니다. 따라서 이 문서의 장점은 규칙의 알림에 앞서 동일한 규칙을 공유하는 것에 있습니다.
개요
- 코드는 반드시(MUST) “기본 코딩 표준” PSR [PSR-1] 을(를) 기준으로 작성해야 합니다.
- 줄 길이에 엄격한 제한을 두지 않아야 합니다(MUST NOT); 가벼운 제한이 필요한 경우 반드시(MUST) 최대 120자로 제한을 두어야 합니다; 한 줄은 80자 이하로 작성하는 것을 권장합니다(SHOULD).
- 들여쓰기는 반드시(MUST) 4개의 공백을 사용합니다. 탭 문자를 사용하지 않습니다(MUST NOT).
- 네임스페이스 또는 use 선언을 작성한 다음에는 반드시(MUST) 빈 줄이 하나 있어야 합니다.
- 클래스의 중괄호는 반드시(MUST) 다음 줄에서 열고, 본문 뒤의 다음 줄에서 닫아야 합니다.
- 메서드의 중괄호는 반드시(MUST) 다음 줄에서 열고, 본문 뒤의 다음 줄에서 닫아야 합니다.
- 모든 프로퍼티와 메서드에 반드시(MUST) public, private, protected와 같이 외부에서 접근하는 경우 참조 가능한 가시성 수준을 선언합니다; abstract 및 final 식별자는 반드시(MUST) 가시성 앞에 선언해야 합니다; static 식별자는 반드시(MUST) 가시성 뒤에 선언해야 합니다.
- 제어 구조 식별자 뒤에는 반드시(MUST) 공백이 하나 있어야 하며, 메서드 및 함수 호출 뒤에는 공백을 사용하지 않습니다(MUST NOT).
- 제어 구조의 중괄호는 반드시(MUST) 같은 줄에서 열어야 하며, 본문 뒤의 다음 줄에서 닫아야 합니다.
- 제어 구조의 여는 괄호는 뒷부분에 공백을 사용하지 않고(MUST NOT), 닫는 괄호는 앞부분에 공백을 사용하지 않습니다(MUST NOT).
예제
다음 예제는 목록에서 정의한 몇 가지 규칙을 간략하게 보여줍니다.
<?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()
{
// 메서드 본문
}
}
General
기본 코딩 표준
코드는 반드시(MUST) “기본 코딩 표준” PSR [PSR-1] 을(를) 기준으로 작성해야 합니다.
파일
모든 PHP 파일은 줄바꿈1에 반드시(MUST) Unix LF(Linefeed)를 사용해야 합니다.
모든 PHP 파일은 반드시(MUST) 빈 줄로 끝내야 합니다.
PHP 코드만 존재하는 파일은 반드시(MUST) 닫는 ?> 태그를 생략해야 합니다.
줄
줄 길이에 엄격한 제한을 두지 않아야 합니다(MUST NOT).
가벼운 제한이 필요한 경우 반드시(MUST) 최대 120자로 제한을 두어야 합니다; 자동 스타일 검사기는 제한된 줄 길이를 반드시(MUST) 작성자에게 경고해야 하지만 오류를 발생시킬 수는 없습니다(MUST NOT).
한 줄의 길이가 80자를 넘는 것을 권장하지 않습니다(SHOULD NOT).
80자를 넘는 긴 줄은 각각 80자를 넘지 않는 여러 줄로 분할하는 것을 권장합니다(SHOULD).
비어있지 않은 줄의 끝에 공백이 있어서는 안 됩니다(MUST NOT).
가독성을 높이고 관련 코드 블록을 표시하기 위해 빈 줄을 추가할 수 있습니다(MAY).
한 줄에 두 개 이상의 명령문이 있어서는 안 됩니다(MUST NOT).
들여쓰기
들여쓰기는 반드시(MUST) 4개의 공백을 사용합니다. 탭 문자를 사용하지 않습니다(MUST NOT).
식별자와 True/False/Null
PHP에 미리 정의된 식별자는 반드시(MUST) 소문자로 작성합니다.
PHP에 정의된 상수 true, false, null은 반드시(MUST) 소문자로 표기합니다.
네임스페이스와 Use 선언
네임스페이스 또는 use 선언을 작성한 다음에는 반드시(MUST) 빈 줄이 하나 있어야 합니다.
use 선언이 있는 경우, 반드시(MUST) 네임스페이스 선언 뒤에 위치해야 합니다.
use 선언에는 반드시(MUST) 하나의 키워드만 있어야 합니다.
다음은 네임스페이스와 use 선언의 예제입니다.
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
// ... 기타 PHP 코드 ...
클래스, 프로퍼티, 메서드
이 문단에서 클래스는 모든 클래스와 인터페이스, 트레이트를 포함합니다.
Extends, Implemets
extents와 implements 식별자는 반드시(MUST) 클래스 이름과 같은 줄에 선언되어야 합니다.
클래스의 중괄호는 반드시(MUST) 다음 줄에서 열고, 본문 뒤의 다음 줄에서 닫아야 합니다.
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
// 상수, 프로퍼티, 메서드
}
implements 식별자 목록은 여러 줄로 분할할 수 있고(MAY) 각 후속 줄은 반드시(MUST) 한 번씩 들여쓰기해야 합니다. 목록의 첫 번째 항목은 반드시(MUST) 다음 줄에 있어야 하며, 반드시(MUST) 한 줄에 하나의 인터페이스만 있어야 합니다.
<?php
namespace Vendor\Package;
use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class ClassName extends ParentClass implements
\ArrayAccess,
\Countable,
\Serializable
{
// 상수, 프로퍼티, 메서드
}
프로퍼티
모든 프로퍼티에 반드시(MUST) public, private, protected와 같이 외부에서 접근하는 경우 참조 가능한 가시성 수준을 선언해야 합니다.
프로퍼티에 var 식별자를 사용할 수 없습니다(MUST NOT).
프로퍼티의 속성은 하나를 초과할 수 없습니다(MUST NOT).
프로퍼티 이름의 앞에 protected 또는 private 가시성 수준을 나타내기 위한 밑줄 기호를 붙여서는 안 됩니다.
속성 선언은 다음과 같습니다.
<?php
namespace Vendor\Package;
class ClassName
{
public $foo = null;
}
메서드
모든 메서드에 반드시(MUST) public, private, protected와 같이 외부에서 접근하는 경우 참조 가능한 가시성 수준을 선언해야 합니다.
프로퍼티 이름의 앞에 protected 또는 private 가시성 수준을 나타내기 위한 밑줄 기호를 붙여서는 안 됩니다.
메서드 이름을 선언하는 경우 뒤에 공백이 있어서는 안 됩니다(MUST NOT). 메서드의 중괄호는 반드시(MUST) 다음 줄에서 열고, 본문 뒤의 다음 줄에서 닫아야 합니다. 여는 소괄호 뒤에 공백이 있어서는 안 되며(MUST NOT), 닫는 소괄호 앞에 공백이 있어서도 안 됩니다(MUST NOT).
메서드 선언은 다음과 같습니다. 소괄호, 쉼표, 공백 및 중괄호의 위치를 확인하세요.
<?php
namespace Vendor\Package;
class ClassName
{
public function fooBarBaz($arg1, &$arg2, $arg3 = [])
{
// 메서드 본문
}
}
메서드 인수
인수 목록에서 각 쉼표 앞에 공백이 있어서는 안 되며(MUST NOT), 각 쉼표 뒤에 반드시(MUST) 공백이 하나씩 있어야 합니다.
기본값이 있는 메서드 인수는 반드시(MUST) 인수 목록의 마지막에 작성해야 합니다.
<?php
namespace Vendor\Package;
class ClassName
{
public function foo($arg1, &$arg2, $arg3 = [])
{
// 메서드 본문
}
}
인수 목록은 여러 줄로 분할할 수 있고(MAY) 각 후속 줄은 반드시(MUST) 한 번씩 들여쓰기해야 합니다. 목록의 첫 번째 항목은 반드시(MUST) 다음 줄에 있어야 하며, 반드시(MUST) 한 줄에 하나의 인수만 있어야 합니다.
인수 목록이 여러 줄에 걸쳐 분할되는 경우 반드시(MUST) 닫는 소괄호와 여는 중괄호를 공백 한 칸의 간격으로 동일한 줄에 별도로 배치해야 합니다.
Abstract, Final, Static
abstract 또는 final 식별자가 존재하는 경우 반드시(MUST) 가시성 앞에 선언해야 합니다
static 식별자가 존재하는 경우 반드시(MUST) 가시성 뒤에 선언해야 합니다.
<?php
namespace Vendor\Package;
abstract class ClassName
{
protected static $foo;
abstract protected function zim();
final public static function bar()
{
// 메서드 본문
}
}
메서드와 함수 호출
메서드를 만들거나 함수 호출을 하는 경우 메서드 또는 함수 이름과 여는 소괄호 사이 또는 바로 뒤에 공백이 있어서는 안 되며(MUST NOT), 닫는 괄호 앞에 공백이 있어서는 안 됩니다(MUST NOT). 인수 목록에서 각 쉼표 앞에 공백을 사용할 수 없으며(MUST NOT), 각 쉼표 뒤에 구분을 위한 공백이 하나 있어야 합니다.
<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);
인수 목록은 여러 줄로 분할할 수 있고(MAY) 각 후속 줄은 반드시(MUST) 한 번씩 들여쓰기해야 합니다. 목록의 첫 번째 항목은 반드시(MUST) 다음 줄에 있어야 하며, 반드시(MUST) 한 줄에 하나의 인수만 있어야 합니다.
<?php
$foo->bar(
$longArgument,
$longerArgument,
$muchLongerArgument
);
제어 구조
제어 구조의 일반적인 스타일 규칙은 다음과 같습니다.
- 제어 구조 식별자 뒤에 반드시(MUST) 공백이 하나 있어야 합니다.
- 여는 소괄호 뒤에 공백이 있어서는 안 됩니다(MUST NOT).
- 닫는 소괄호 앞에 공백이 있어서는 안 됩니다(MUST NOT).
- 닫는 소괄호와 여는 중괄호 사이에는 반드시(MUST) 공백이 하나 있어야 합니다.
- 제어 구조의 본문은 반드시(MUST) 한 번 들여쓰기해야 합니다.
- 닫는 중괄호는 반드시(MUST) 본문의 다음 줄에 있어야 합니다.
각 구조의 본문은 반드시(MUST) 중괄호로 묶어야 합니다. 이렇게 하면 구조의 형태를 표준화 할 수 있고, 새로운 줄을 본문에 추가할 때 오류가 발생할 가능성을 줄일 수 있습니다.
If, Elseif, Else
if 구조는 다음과 같습니다. 소괄호, 공백 및 중괄호의 위치를 확인하세요; else와 elseif는 이전의 본문 내용을 닫는 중괄호와 같은 줄에 작성합니다.
<?php
if ($expr1) {
// if 본문
} elseif ($expr2) {
// elseif 본문
} else {
// else 본문;
}
모든 제어 식별자가 단일 단어처럼 보이도록 else if 대신 elseif 식별자를 사용하는 것을 권장합니다(SHOULD).
Switch, Case
switch 구조는 다음과 같습니다. 소괄호, 공백 및 중괄호의 위치를 확인하세요. case 문은 switch에서 반드시(MUST) 한 번 들여쓰기해야 하며, break 식별자(또는 다른 종료 식별자)는 반드시(MUST) case 본문과 동일한 수준으로 들여쓰기해야 합니다. 비어 있지 않은 case 본문에서 fall-through가 의도된 경우 반드시(MUST) // no break
와 같은 주석이 있어야 합니다.
<?php
switch ($expr) {
case 0:
echo '첫번째 case, break 식별자를 사용합니다';
break;
case 1:
echo '두번째 case, fall-through를 보여줍니다';
// no break
case 2:
case 3:
case 4:
echo '세번째 case, break 식별자 대신 return을 사용합니다';
return;
default:
echo 'default case';
break;
}
While, Do while
while 구조는 다음과 같습니다. 소괄호, 공백 및 중괄호의 위치를 확인하세요.
<?php
while ($expr) {
// 구조 본문
}
마찬가지로 do while 구조는 다음과 같습니다. 소괄호, 공백 및 중괄호의 위치를 확인하세요.
<?php
do {
// 구조 본문
} while ($expr);
For
for 구조는 다음과 같습니다. 소괄호, 공백 및 중괄호의 위치를 확인하세요.
<?php
for ($i = 0; $i < 10; $i++) {
// for 본문
}
Foreach
foreach 구조는 다음과 같습니다. 소괄호, 공백 및 중괄호의 위치를 확인하세요.
<?php
foreach ($iterable as $key => $value) {
// foreach body
}
Try, Catch
try catch 구조는 다음과 같습니다. 소괄호, 공백 및 중괄호의 위치를 확인하세요.
<?php
try {
// try 본문
} catch (FirstExceptionType $e) {
// catch 본문
} catch (OtherExceptionType $e) {
// catch 본문
}
클로저
클로저는 반드시(MUST) function 지시자 뒤로 공백을 사용하며, use 지시자 앞뒤로 공백을 사용하여 선언해야 합니다.
중괄호는 반드시(MUST) 같은 줄에서 열고, 본문 뒤의 다음 줄에서 닫아야 합니다.
인수 목록이나 변수 목록의 여는 소괄호 뒤에 공백이 있어서는 안 되며(MUST NOT), 닫는 소괄호 앞에 공백이 있어서는 안 됩니다(MUST NOT).
인수 목록과 변수 목록에서 각 쉼표 앞에 공백을 사용할 수 없으며(MUST NOT), 각 쉼표 뒤에 구분을 위한 공백이 하나 있어야 합니다.
기본값이 있는 클로저 인수는 반드시(MUST) 인수 목록의 끝에 와야 합니다.
클로저 선언은 다음과 같습니다. 소괄호, 쉼표, 공백 및 중괄호의 위치를 확인하세요.
<?php
$closureWithArgs = function ($arg1, $arg2) {
// 본문
};
$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
// 본문
};
인수 목록은 여러 줄로 분할할 수 있고(MAY) 각 후속 줄은 반드시(MUST) 한 번씩 들여쓰기해야 합니다. 목록의 첫 번째 항목은 반드시(MUST) 다음 줄에 있어야 하며, 반드시(MUST) 한 줄에 하나의 인수만 있어야 합니다.
인수 목록이 여러 줄에 걸쳐 분할되는 경우 반드시(MUST) 닫는 소괄호와 여는 중괄호를 공백 한 칸의 간격으로 동일한 줄에 별도로 배치해야 합니다.
다음은 여러 줄에 걸쳐 분할된 인수 목록과 변수 목록이 있거나 없는 클로저의 예입니다.
<?php
$longArgs_noVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) {
// 본문
};
$noArgs_longVars = function () use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// 본문
};
$longArgs_longVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// 본문
};
$longArgs_shortVars = function (
$longArgument,
$longerArgument,
$muchLongerArgument
) use ($var1) {
// 본문
};
$shortArgs_longVars = function ($arg) use (
$longVar1,
$longerVar2,
$muchLongerVar3
) {
// 본문
};
클로저가 함수 또는 메소드 호출에서 인수로 직접 사용되는 경우에도 형식 지정 규칙을 적용합니다.
<?php
$foo->bar(
$arg1,
function ($arg2) use ($var1) {
// 본문
},
$arg3
);
결론
이 가이드에는 의도적으로 생략된 스타일과 관행 요소가 많이 있습니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다.
- 전역 변수 및 전역 상수 선언
- 함수 선언
- 연산자 및 할당
- 라인 간 정렬
- 주석 및 문서 블록
- 클래스 이름 접두사 및 접미사
- 모범 사례
향후 권장 사항은 스타일과 관행의 해당 요소 또는 기타 요소를 다루기 위해 이 가이드를 수정하고 확장할 수 있습니다.
Paul M. Jones et al. “Coding Style Guide”. PSR-2, Jun 5, 2012. https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md. accessed 15 Sep 2023.

INAS의 블LOG에 오신 것을 환영합니다