Contents

[PHP] PSR(PHP Standards Recommendations)이란?

Contents

PHP Standards Recommendations의 약자로 PHP-FIG(PHP-FrameWork Interop Group)에서 만든 표준 권고안입니다.

  • 작성예정 목록
    • PSR-6
    • PSR-7
    • PSR-11
    • PSR-13
    • PSR-15
    • PSR-16

오토로딩 표준으로 PSR-4가 제정되며 DEPRECATED 되었습니다.

  • \<Vendor Name>\(<NameSpace>\)*<Class Name>의 구조를 따릅니다.
  • 각 네임스페이스는 ("Vendor Name")이 최상위 네임스페이스로 있어야합니다.
  • 각 네임스페이스는 원하는 만큼 하위 네임스페이스를 가질 수 있습니다.
  • 각 네임스페이스 구분자는 파일시스템에서 로딩될때 DIRECTORY_SEPARATOR로 변환됩니다.
  • 클래스명의 각 _ 문자는 DIRECTORY_SEPARATOR로 변환됩니다.
  • 기타 자세한 사항은 PSR-0에서 확인 가능합니다.

\Doctrine\Commone\IsolatedClassLoader =>/path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php \Symfony\Core\Request =>/path/to/project/lib/vendor/Symfony/Core/Request.php

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-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\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-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에 위치합니다.

참고자료