[PHP] PSR(PHP Standards Recommendations)이란?
PSR이란?
PHP Standards Recommendations의 약자로 PHP-FIG(PHP-FrameWork Interop Group)에서 만든 표준 권고안입니다.
- 작성예정 목록
- PSR-6
- PSR-7
- PSR-11
- PSR-13
- PSR-15
- PSR-16
PSR-0 (DEPRECATED) : Autoloading Standard
오토로딩 표준으로 PSR-4가 제정되며 DEPRECATED 되었습니다.
\<Vendor Name>\(<NameSpace>\)*<Class Name>
의 구조를 따릅니다.- 각 네임스페이스는
("Vendor Name")
이 최상위 네임스페이스로 있어야합니다. - 각 네임스페이스는 원하는 만큼 하위 네임스페이스를 가질 수 있습니다.
- 각 네임스페이스 구분자는 파일시스템에서 로딩될때
DIRECTORY_SEPARATOR
로 변환됩니다. - 클래스명의 각
_
문자는DIRECTORY_SEPARATOR
로 변환됩니다. - 기타 자세한 사항은 PSR-0에서 확인 가능합니다.
Example)
\Doctrine\Commone\IsolatedClassLoader
=>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request
=>/path/to/project/lib/vendor/Symfony/Core/Request.php
PSR-1 : Basic Coding Standard
PHP 코드를 공유하는데 있어 기술적 상호 운용성을 위해 고려 해야 할 표준 코딩 가이드입니다.
<?php
와<?=
태그만 사용해야합니다.PHP 코드에는 BOM(Byte Order Mark) 없이 UTF-8로만 사용해야합니다.
네임스페이스와 클래스는 PSR(PSR-0, PSR-4)의 오토로딩을 따라야합니다.
- 클래스명은
StudlyCaps
와 같이 첫글자를 대문자로 합니다.
<?php // PHP 5.3 이후 버전 namespace Vendor\Model; class Foo { } // PHP 5.3 이전 버전 class Vendor_Model_Foo { }
- 클래스명은
상수는
_
를 구분자로 대문자로 선언해야합니다.ex)const CURRENT_VERSION = 1.0;
프로퍼티명에 대한 규칙은 정해져 있지않으나, 스코프에서 일관적이어야합니다.
메소드는 카멜케이스를 사용해야합니다.
ex)camelCase()
PSR-2 : Coding Style Guide
PSR-1의 확장으로 표준 코딩 스타일 가이드를 다룹니다.
PSR-1을 따라야합니다.
들여쓰기 할때는 탭을 사용하지 않고 스페이스 4개를 사용합니다.
라인 수에 대한 엄격한 제한은 아니지만, 한 줄에는 120자 이하, 라인 수는 80개 이하로 작성합니다.
namespace선언과 use 선언들 후에는 한줄을 띄워 작성합니다.
클래스와 메소드들의 여는 괄호는 다음줄에 작성하고, 닫는 괄호는 내용이 끝난 다음 줄에 작성합니다.
- ex)
<?php namespace Vendor\Package; use BazClass as Baz; use OtherVendor\OtherPackage\BazClass; class TestClass extends Baz { public function alert($msg) { echo $msg; } }
모든 프로퍼티와 메소드는 접근제어자가 선언되어야합니다.
- abstract와 final 키워드는 접근제어자 이전에 선언되고, static 키워드는 접근제어자 이후에 선언되어야합니다.
제어문은 사이에 스페이스가 있어야합니다.
- 메소드와 함수호출은 그렇지 않습니다.
- ex)
<?php public function Foo($a, $b){ if ($a === $b) { echo "equal"; } } Foo(1, 2);
PHP 파일은 빈 줄로 끝나야 하며, PHP로만 이루어진 파일은 닫는 태그인
?>
를 생략해야합니다.
PSR-3 : Logger Interface
로깅 라이브러리의 공통적인 인터페이스를 명세합니다.
라이브러리가 Psr\Log\LoggerInterface
의 객체를 받아 간편하고 보편적인 방법으로 그것에 로그를 작성할 수 있도록 하는것이 목표입니다.
- 로거 인터페이스는 8개의 RFC 5424 레벨(debug, info, notice, warning, error, critical, alert, emergency)로 로그 작성을 하기 위한 메소드를 제공합니다.
- 9번째 메소드인
log
는 첫번째 인자로 로그 레벨을 받고, 호출시 해당 레벨의 메소드를 호출하는것과 같은 결과를 가집니다.- 해당 레벨의 메소드가 정의되어 있지 않는 경우,
Psr\Log\InvalidArgumentException
에러를 보내야합니다.
- 해당 레벨의 메소드가 정의되어 있지 않는 경우,
- 모든 메소드는 string 형식의 메시지를 받거나, __toString() 처리 된 object를 받습니다.
- 컨텍스트에 주어진 값을 execption에 보내거나, php error나 warning, notice로 보내면 안됩니다.
PSR-4 : Autoloader
파일 경로를 통해 클래스를 오토로딩 하기위한 명세로, PSR-0를 포함하고 있습니다.
class
라는 용어는 클래스와 인터페이스, 트레이트 또는 다른 비슷한 구조들을 의미합니다.- 정규화 된 클래스명의 형식은 다음을 따릅니다.
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
- 네임스페이스의 맨 처음은 “Vendor namespace"로 알려진것으로 시작합니다.
- 하나 이상의 서브네임스페이스명을 가집니다.
- 끝을 클래스명으로 작성 합니다.
- 소문자와 대문자의 조합을 혼합하여 작성할 수 있습니다.
- 대소문자를 구분하여 참조해야합니다.
<?php
// guzzle/src/ClientInterface.php
namespace GuzzleHttp;
use GuzzleHttp\Exception\GuzzleException;
interface ClientInterface
{
}
GuzzleHttp\Exception\GuzzleException은 GuzzleHttp의 Base-Directory(src) 안에 있는 Exception\GuzzleException.php에 위치합니다.
참고자료