PSR-1 표준 코딩


PSR-1은 기본적인 PHP의 표준 코딩 가이드입니다.
PHP 태그, 인코딩 및 이름 규칙 등을 서로 규약하여 호환성을 증대합니다.


PHP 파일


  • 시작 태그: PHP의 시작과 종료 태그입니다. PHP는 다양한 태그 약자가 존재합니다.
    PSR-1에서는 <?php ?><?= ?> 만 사용하기를 권고합니다.

  • 인코딩: PHP 소스 텍스트 파일의 인코딩을 규약합니다.
    보통 텍스트 에디터에는 다양한 문서 인코딩 방식을 지원하지만 PSR-1 에서는 문서 인코딩 포맷을 UTF-8로 사용할 것을 권고합니다.

UTF-8은 그냥 UTF-8 방식과 BOM(byte order Mark)이 적용된 두 가지 방식이 있습니다.
PSR-1에서는 BOM이 적용되지 않은 그냥 UTF-8을 권고합니다.


사이드 이펙트


코드를 작성할 때는 사이드 이펙트(side effect)가 적게 발생되도록 주의합니다.
사이드 이펙트는 다양한 곳에서 발생할 수 있습니다.

한 개의 PHP 파일 안에서도 클래스, 함수, 상수 등 새로운 심볼을 선언할 때, 또한 이것들이 다른 사이드 이펙트의 원인이 되어서는 안 됩니다.

사이드 이펙트의 의미는 클래스, 함수, 상수를 직접적인 관련 없이 로직이 실행되는 것입니다.
사이드 이펙트 적용될 수도 있지만 그 사용을 구체적으로 제한하지는 않습니다(이를테면, 출력 발생, require 또는 include 사용, 외부 서비스 연결, ini 설정 변경, 방출 오류 또는 예외, 글로벌 또는 정적변수 변경, 파일을 읽거나 저장 등).

다음은 선언과 사이드 이펙트 관련된 파일의 예 입니다.

<?php
	// 사이드 이펙트: ini 설정을 변경
	ini_set('error_reporting', E_ALL);

	// 사이드 이펙트: 파일I/O 등을 이용하여 파일을 읽음
	include "file.php";

	// 사이드 이펙트: 화면 I/O 로 출력을 발생
	echo "<html>\n";

	// 선언
	function foo()
	{
    	// 함수 본문 내용...
	}

다음은 사이드 이펙트가 적게 발생하는 스타일입니다.

<?php
	// 선언
	function foo()
	{
		// 함수 본문 내용...
	}

	// conditional declaration is *not* a side effect
	if (! function_exists('bar')) {
		function bar()
		{
			// 함수 본문 내용...
		}
	}


네임스페이스와 클래스


네임스페이스와 클래스는 다음 장에서 설명하지만 네임스페이스와 클래스는 PSR 오토로딩 권장을 따라서 사용해야 합니다.

클래스는 PHP 파일 하나에 한 개씩 작성하는 것을 권장합니다.
또한 네임스페이스는 이름은 최소한 한 개 이상의 레벨로 작성합니다.
1개 이상을 사용해야 하는 이유는 최상의 레벨은 벤더 이름으로 사용하기 때문입니다.

PHP 5.3 이상에서는 네임스페이스를 사용하는 것을 적극 권장합니다.

<?php
// PHP 5.3 and later:
namespace Vendor\Model;

class Foo
{
}

PHP 5.2 이전 버전에서는 _를 통해 벤더, 모델, 클래스명 등으로 구분할 것을 권장합니다.

<?php
// PHP 5.2.x and earlier:
class Vendor_Model_Foo
{
}


클래스 상수, 프로퍼티 및 매서드


클래스, 인터페이스, 트레이트 등의 이름을 작명할 때 다음과 같은 작명 방식을 권장합니다.

클래스명: 클래스 이름은 낙타 표기법(camel case)인 StudlyCaps 스타일로 작성합니다.
클래스 이름의 첫 글자는 대문자로 표기하는 타이틀 케이스 형태로 작성을 권고합니다.

예) StudyCaffe, JinyPhp

상수: 상수는 대문자와 밑줄 _로 구분하여 사용합니다.

<?php
namespace Vendor\Model;

class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}

메서드: 메서드 이름은 낙타 표기법으로 작성합니다. 메서드의 시작 문자는 소문자를 사용합니다.

예) camelCase (), loveStudy()

프로퍼티: 프로퍼티(변수)는 낙타 표기법(StudlyCaps, camelCase, under_score)을 구분하지는 않습니다.
코드상에서 일관성 있게 사용하면 됩니다.