[PHP Standard Recommendation] PSR 소개

[PHP Standard Recommendation] PSR 소개

안녕하세요, 린치핀소프트 한광희입니다.

 

최근에 저희 린치핀소프트는 PHP-FIG(Framework Interoperability Group) 그룹에서 제안하는 PSR(PHP Standard Recommendation) 을 전사적으로 프로젝트에 도입하여 활용하고 있습니다. 사실 PSR이라는 규칙 및 표준안을 준수하여 개발하는데 있어서 발생하는 직접적인 이익 보다는, PSR을 기반으로 하는 “Composer” 등을 활용하여 컴포넌트(Component) 기반의 PHP 개발을 지향하여 저희 개발팀에 있어 그 이익을 향유하고 있습니다.

뒤이어 작성할 포스트에서는 “Composer(콤포저)”와 “Packgist”를 활용하여 개발방향을 조금 변경해본 소감과 그에 대한 소개에 대한 글을 작성하도록 하겠습니다.

우선 이번 글에서는 PSR에 대한 소개입니다. PSR(PHP Standard Recommendation)은 PHP-FIG 라는 PHP 개발자 그룹에서 제안하는 PHP 표준안입니다. PSR은 PSR-1, PSR-2 와 같이 각 안건마다 제안하는 규칙들이 있습니다. 오늘은 PSR-1, PSR-2, PSR-3, PSR-4 에 대해서 소개 해보도록 하겠습니다.

 

우선 PSR은 개발자 커뮤니티에서 제안되어 검토후 확정(Accepted) 되는 절차를 밟아 나갑니다.

Pre-Draft -> Draft -> Review -> Accepted 와 같은 절차를 통해 최종적으로 Accepted 된 규약에 넘버링이 되어 PSR Github 페이지에 공개됩니다.

(물론 Draft,Review,Accepted 단계에 진행중인 사항도 PHP-FIG 그룹의 홈페이지에서 확인가능합니다.)

PSR Github : https://github.com/php-fig/fig-standards

PHP-FIG  : http://www.php-fig.org/psr/

 

PSR 소개

 

PSR-1

PSR-1은 기본 코드 스타일에 대한 내용입니다.

PSR-1 에 대한 개요는 다음과 같습니다. ( https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md )

  • Files MUST use only <?php and <?= tags.
  • Files MUST use only UTF-8 without BOM for PHP code.
  • Files SHOULD either declare symbols (classes, functions, constants, etc.) or cause side-effects (e.g. generate output, change .ini settings, etc.) but SHOULD NOT do both.
  • Namespaces and classes MUST follow an “autoloading” PSR: [PSR-0, PSR-4].
  • Class names MUST be declared in StudlyCaps.
  • Class constants MUST be declared in all upper case with underscore separators.
  • Method names MUST be declared in camelCase.

 

PSR-1의 개요를 살펴보면 그 이름대로 기초적인 코딩에 관한 가이드를 제안하고 있습니다. 카멜표기법이나 네임스페이스나 클래스 정의의 위치등을 제안하고 있습니다.

특히나 PSR-1에서 눈여겨볼점은 하나의 PHP 파일은 하나의 목적에 특화되어 있어야 한다는 것입니다. 쉽게 풀어보자면 하나의 PHP 파일은 하나의 클래스,함수,상수 등을 정의하거나 한 가지 역할에 집중해야 한다는 내용입니다. 아래는 그 내용에 대한 예시입니다.

 

capture__2016-08-30

 

 

 

예시 출처 : https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md 본문 중.

 

 

PSR-2

PSR-2도 코딩 스타일에 대한 가이드입니다.

PSR-2 에 대한 개요는 다음과 같으며, https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md 에서 살펴볼 수 있습니다.

 

  • Code MUST follow a “coding style guide” PSR [PSR-1].
  • Code MUST use 4 spaces for indenting, not tabs.
  • There MUST NOT be a hard limit on line length; the soft limit MUST be 120 characters; lines SHOULD be 80 characters or less.
  • There MUST be one blank line after the namespace declaration, and there MUST be one blank line after the block of usedeclarations.
  • Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.
  • Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.
  • Visibility MUST be declared on all properties and methods; abstract and final MUST be declared before the visibility;static MUST be declared after the visibility.
  • Control structure keywords MUST have one space after them; method and function calls MUST NOT.
  • Opening braces for control structures MUST go on the same line, and closing braces MUST go on the next line after the body.
  • Opening parentheses for control structures MUST NOT have a space after them, and closing parentheses for control structures MUST NOT have a space before.

 

사실 PSR-2는 평소 자신이 선호하는 코딩 스타일과 많이 연관되어 있어 해당 규칙을 준수하기 귀찮다는 생각이 들때도 있습니다. 예를 들어 들여쓰기 에 있어서도 tab기반이 아닌 4칸의 공백을 사용하라는 규칙안, 제어문에 있어서는 제어문 다음에하는 한 칸의 공백이 있어야 하고 “여는 괄호”는 제어문과 동일한 줄(line)에, “닫는 괄호”는 제어문의 내용 다음 줄(line)에 입력해야 하는 등 자신이 선호하는 코딩 스타일과 다르다면 노력을 요하는 부분이 될 수 있습니다.

 

 

PSR-3

PSR-3은 로거 인터페이스입니다.

아래의 PSR-3 문서에서 정의하는 것처럼 “로그(Log)” 관련 라이브러리에서는 준수해야할 혹은 기초로 삼아야 할 인터페이스를 제안하고 있습니다. 저희도 사용하는 대표적인 로그 라이브러리인 Monolog와 같은 라이브러리로 PSR-3의 로그 라이브러리 인터페이스를 확장하여 정의되었습니다.

 

This document describes a common interface for logging libraries.

The main goal is to allow libraries to receive a Psr\Log\LoggerInterface object and write logs to it in a simple and universal way. Frameworks and CMSs that have custom needs MAY extend the interface for their own purpose, but SHOULD remain compatible with this document. This ensures that the third-party libraries an application uses can write to the centralized application logs.

 

PSR-3 의 로거 인터페이스에 대한 내용은 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md 에서 확인해볼 수 있습니다.

 

PSR-4

PSR-4 는 오토로더에 대한 내용입니다. “오토로더(Autoloader)”, 오토로더를 사용없이 보통 PHP 클래스나 다른 함수들을 참조할때는 “include” ,”require” 구문을 사용하여 정의된 클래스와 함수들의 파일을 삽입(Include) 한 후에 삽입된 파일에서 정의된 클래스나 함수를 사용하는 것이 보통입니다. 하지만 참조되어야 하는 PHP 클래스나 함수가 많아지고 그 구조가 복잡하게 될때에는 조금 애먹게 되는 상황이 발생될 수 있습니다.(사실, 저희의 개발규모에서는 수천개의 클래스를 인클루드해야 하는 상황까지는 접해보지 않아서 오토로더에 대한 필요성이 조직에 제기된 상황은 아니었지만 직접 오토로더를 사용해 보니 굉장히 편해졌다는 경험을 받았습니다.)

이때, 따로 클래스에 대한 include,require문을 사용하지 않고 런타임시에 클래스나 함수를 호출할때 그때, 클래스,함수가 정의된 파일을 자동으로 로드하게끔 하는 역할을 수행하는 것이 오토로더(Autoloader)입니다.

 

아래는 PSR-4 의 본문에 기입된 내용입니다.

This PSR describes a specification for autoloading classes from file paths. It is fully interoperable, and can be used in addition to any other autoloading specification, including PSR-0. This PSR also describes where to place files that will be autoloaded according to the specification.

 

그리고 콤포저를 사용하는 입장에서는 PSR-4를 기반으로 직접 오토로더를 제작하여 사용하기 보다는 Composer에서 제공하는 PSR-4 기반의 오토로더를 사용하게 됩니다.

 

 

Development

이 글에 대한 생각이 어떠세요? 설명이 어렵거나 잘못된 내용에 대해서도 말씀해주세요!