PHP 스타일 가이드

다음 페이지에서는 CodeIgniter 개발에 기여할 때 준수하는 코딩 스타일을 설명합니다. 자신만의 CodeIgniter 애플리케이션에서 이 스타일을 사용할 필요는 없지만 권장됩니다.

파일 형식

파일은 유니코드(UTF-8) 인코딩으로 저장해야 합니다. BOM은 사용하지 않아야 합니다. UTF-16 및 UTF-32와 달리 UTF-8 인코딩 파일에서는 바이트 순서를 나타낼 필요가 없으며, BOM은 PHP에서 출력을 전송하는 부정적인 부작용을 일으켜 애플리케이션이 자체 헤더를 설정할 수 없게 할 수 있습니다. Unix 줄 바꿈(LF)을 사용해야 합니다.

다음은 일반적인 텍스트 편집기 중 일부에서 이러한 설정을 적용하는 방법입니다. 텍스트 편집기에 대한 지침은 다를 수 있습니다. 텍스트 편집기의 문서를 확인하세요.

TextMate

  1. 애플리케이션 환경 설정 열기

  2. 고급을 클릭한 다음 “저장” 탭 클릭

  3. “파일 인코딩”에서 “UTF-8 (권장)” 선택

  4. “줄 끝”에서 “LF (권장)” 선택

  5. 선택 사항: 열려있는 파일의 줄 끝을 새 기본 설정으로 수정하려면 “기존 파일에도 사용”을 선택하세요.

BBEdit

  1. 애플리케이션 환경 설정 열기

  2. 왼쪽에서 “텍스트 인코딩” 선택

  3. “새 문서의 기본 텍스트 인코딩”에서 “유니코드 (UTF-8, BOM 없음)” 선택

  4. 선택 사항: “파일 인코딩을 추측할 수 없는 경우 다음 사용”에서 “유니코드 (UTF-8, BOM 없음)” 선택

  5. 왼쪽에서 “텍스트 파일” 선택

  6. “기본 줄 바꿈”에서 “Mac OS X and Unix (LF)” 선택

PHP 닫기 태그

PHP 문서의 PHP 닫기 태그 ?>는 PHP 파서에게 선택 사항입니다. 하지만 사용하는 경우 닫기 태그 뒤에 오는 공백(개발자, 사용자, FTP 애플리케이션이 추가한 것)이 원하지 않는 출력, PHP 에러를 일으키거나, 후자가 억제되면 빈 페이지가 될 수 있습니다. 이 때문에 모든 PHP 파일은 PHP 닫기 태그를 반드시 생략하고 대신 단일 빈 줄로 끝내야 합니다.

파일 이름 지정

클래스 파일은 Ucfirst 방식으로 이름을 지정해야 하며, 다른 파일 이름(설정, 뷰, 일반 스크립트 등)은 모두 소문자여야 합니다.

잘못된 예:

somelibrary.php
someLibrary.php
SOMELIBRARY.php
Some_Library.php

Application_config.php
Application_Config.php
applicationConfig.php

올바른 예:

Somelibrary.php
Some_library.php

applicationconfig.php
application_config.php

또한 클래스 파일 이름은 클래스 이름과 일치해야 합니다. 예를 들어 Myclass라는 클래스가 있다면 파일 이름은 Myclass.php이어야 합니다.

클래스 및 메소드 이름 지정

클래스 이름은 항상 대문자로 시작해야 합니다. 여러 단어는 밑줄로 구분해야 하며 CamelCase를 사용하지 않습니다.

잘못된 예:

class superclass
class SuperClass

올바른 예:

class Super_class
class Super_class {

        public function __construct()
        {

        }
}

클래스 메소드는 완전히 소문자이어야 하며 기능을 명확하게 나타내는 이름을 가져야 하며, 가능하면 동사를 포함하는 것이 좋습니다. 지나치게 길고 장황한 이름은 피하세요. 여러 단어는 밑줄로 구분해야 합니다.

잘못된 예:

function fileproperties()               // 설명적이지 않고 밑줄 구분자가 필요합니다
function fileProperties()               // 설명적이지 않고 CamelCase를 사용합니다
function getfileproperties()            // 더 좋습니다! 하지만 밑줄 구분자가 없습니다
function getFileProperties()            // CamelCase를 사용합니다
function get_the_file_properties_from_the_file()        // 너무 깁니다

올바른 예:

function get_file_properties()  // 설명적이고, 밑줄 구분자가 있으며, 모두 소문자입니다

변수 이름

변수 이름 지정 지침은 클래스 메소드에 사용되는 것과 매우 유사합니다. 변수는 소문자만 포함하고, 밑줄 구분자를 사용하며, 목적과 내용을 나타내는 합리적인 이름을 가져야 합니다. 매우 짧은 단어가 아닌 변수는 for() 루프의 반복자로만 사용해야 합니다.

잘못된 예:

$j = 'foo';             // 단일 문자 변수는 for() 루프에서만 사용해야 합니다
$Str                    // 대문자를 포함합니다
$bufferedText           // CamelCasing을 사용하며, 의미를 잃지 않고 줄일 수 있습니다
$groupid                // 여러 단어, 밑줄 구분자가 필요합니다
$name_of_last_city_used // 너무 깁니다

올바른 예:

for ($j = 0; $j < 10; $j++)
$str
$buffer
$group_id
$last_city

주석

일반적으로 코드는 풍부하게 주석 처리해야 합니다. 이것은 경험이 적은 프로그래머를 위해 코드의 흐름과 의도를 설명하는 데 도움이 될 뿐만 아니라 수개월 후 자신의 코드로 돌아올 때 매우 귀중할 수 있습니다. 주석에 대한 필수 형식은 없지만 다음을 권장합니다.

DocBlock 스타일 주석은 IDE에서 수집할 수 있도록 클래스, 메소드, 프로퍼티 선언 앞에 옵니다:

/**
 * Super Class
 *
 * @package     Package Name
 * @subpackage  Subpackage
 * @category    Category
 * @author      Author Name
 * @link        http://example.com
 */
class Super_class {
/**
 * Encodes string for use in XML
 *
 * @param       string  $str    Input string
 * @return      string
 */
function xml_encode($str)
/**
 * Data for class manipulation
 *
 * @var array
 */
public $data = array();

코드 내에서 단일 행 주석을 사용하고, 큰 주석 블록과 코드 사이에 빈 줄을 남기세요.

// 문자열을 줄 바꿈으로 분리합니다
$parts = explode("\n", $str);

// 발생하는 것과 이유에 대해 더 많은 세부 사항을 제공해야 하는 긴 주석은
// 여러 단일 행 주석을 사용할 수 있습니다. 너비를 합리적으로 유지하려고
// 하세요, 약 70자가 읽기 가장 쉽습니다. 더 많은 세부 사항을 제공할 수 있는
// 영구적인 외부 리소스에 링크하는 것을 주저하지 마세요:
//
// http://example.com/information_about_something/in_particular/

$parts = $this->foo($parts);

상수

상수는 변수와 동일한 지침을 따르지만 상수는 항상 완전히 대문자여야 합니다. 적절한 경우 항상 CodeIgniter 상수를 사용하세요. 예: SLASH, LD, RD, PATH_CACHE 등.

잘못된 예:

myConstant      // 밑줄 구분자가 없고 완전히 대문자가 아닙니다
N               // 단일 문자 상수 없음
S_C_VER         // 설명적이지 않습니다
$str = str_replace('{foo}', 'bar', $str);       // LD와 RD 상수를 사용해야 합니다

올바른 예:

MY_CONSTANT
NEWLINE
SUPER_CLASS_VERSION
$str = str_replace(LD.'foo'.RD, 'bar', $str);

TRUE, FALSE, NULL

TRUE, FALSE, NULL 키워드는 항상 완전히 대문자여야 합니다.

잘못된 예:

if ($foo == true)
$bar = false;
function foo($bar = null)

올바른 예:

if ($foo == TRUE)
$bar = FALSE;
function foo($bar = NULL)

논리 연산자

일부 출력 장치에서 명확하지 않을 수 있으므로(예: 숫자 11처럼 보임) || “or” 비교 연산자 사용은 권장하지 않습니다. AND보다 &&가 선호되지만 둘 다 허용되며, ! 앞뒤에는 항상 공백이 있어야 합니다.

잘못된 예:

if ($foo || $bar)
if ($foo AND $bar)  // 괜찮지만 일반적인 구문 강조 애플리케이션에는 권장하지 않음
if (!$foo)
if (! is_array($foo))

올바른 예:

if ($foo OR $bar)
if ($foo && $bar) // 권장
if ( ! $foo)
if ( ! is_array($foo))

반환 값 비교 및 형 변환

일부 PHP 함수는 실패 시 FALSE를 반환하지만 느슨한 비교에서 FALSE로 평가되는 “” 또는 0의 유효한 반환 값을 가질 수도 있습니다. 반환 값이 기대하는 것이 맞고 동등한 느슨한 형 평가 값이 아닌지 확인하기 위해 조건문에서 이러한 반환 값을 사용할 때 변수 형을 명시적으로 비교하세요.

자신의 변수를 반환하고 확인할 때도 동일한 엄격함을 사용하세요. 필요에 따라 ===!==을 사용하세요.

잘못된 예:

// 'foo'가 문자열 시작 부분에 있으면 strpos는 0을 반환하여
// 이 조건문이 TRUE로 평가됩니다
if (strpos($str, 'foo') == FALSE)

올바른 예:

if (strpos($str, 'foo') === FALSE)

잘못된 예:

function build_string($str = "")
{
        if ($str == "") // 이런! FALSE나 정수 0이 인수로 전달되면 어떻게 됩니까?
        {

        }
}

올바른 예:

function build_string($str = "")
{
        if ($str === "")
        {

        }
}

꽤 유용할 수 있는 형 변환에 관한 정보도 참조하세요. 형 변환은 약간 다른 효과가 있어 유용할 수 있습니다. 예를 들어 변수를 문자열로 형 변환할 때 NULL과 불리언 FALSE 변수는 빈 문자열이 되고, 0(및 다른 숫자)은 숫자 문자열이 되며, 불리언 TRUE는 “1”이 됩니다:

$str = (string) $str; // $str을 문자열로 형 변환

디버깅 코드

주석 처리된 경우에도 제출물에 디버깅 코드를 남기지 마세요. var_dump(), print_r(), die()/exit()와 같은 것은 디버깅 이외의 특정 목적이 아닌 한 코드에 포함해서는 안 됩니다.

파일의 공백

PHP 여는 태그 앞이나 PHP 닫기 태그 뒤에 공백이 있으면 안 됩니다. 출력이 버퍼링되므로 파일의 공백은 CodeIgniter가 콘텐츠를 출력하기 전에 출력이 시작되어 에러 및 CodeIgniter가 적절한 헤더를 보낼 수 없게 만들 수 있습니다.

호환성

CodeIgniter는 PHP 5.6 이상을 권장하지만 PHP 5.4.8과 호환되어야 합니다. 코드는 이 요구 사항과 호환되거나, 적절한 폴백을 제공하거나, 사용자 애플리케이션에 영향을 주지 않고 조용히 종료되는 선택적 기능이어야 합니다.

또한 함수를 사용할 수 없을 때 대안적인 방법을 포함하지 않는 한 기본이 아닌 라이브러리가 설치되어야 하는 PHP 함수를 사용하지 마세요.

클래스당 하나의 파일

밀접하게 관련된 경우를 제외하고 각 클래스에 별도의 파일을 사용하세요. 여러 클래스를 포함하는 CodeIgniter 파일의 예는 Xmlrpc 라이브러리 파일입니다.

공백

공백이 아닌 탭을 코드의 공백으로 사용하세요. 이것은 사소한 것처럼 보일 수 있지만 공백 대신 탭을 사용하면 코드를 보는 개발자가 자신이 사용하는 애플리케이션에서 선호하고 커스터마이즈할 수 있는 수준의 들여쓰기를 가질 수 있습니다. 그리고 부수적인 이점으로 4개의 공백 문자 대신 탭 문자 하나를 저장하므로 (약간) 더 작은 파일이 됩니다.

줄 바꿈

파일은 Unix 줄 바꿈으로 저장해야 합니다. 이것은 Windows에서 작업하는 개발자에게 더 문제가 되지만 어쨌든 텍스트 편집기가 Unix 줄 바꿈으로 파일을 저장하도록 설정되어 있는지 확인하세요.

코드 들여쓰기

Allman 스타일 들여쓰기를 사용하세요. 클래스 선언을 제외하고 중괄호는 항상 자체 줄에 배치되며, 그것을 “소유하는” 제어 구문과 동일한 수준으로 들여쓰기됩니다.

잘못된 예:

function foo($bar) {
        // ...
}

foreach ($arr as $key => $val) {
        // ...
}

if ($foo == $bar) {
        // ...
} else {
        // ...
}

for ($i = 0; $i < 10; $i++)
        {
        for ($j = 0; $j < 10; $j++)
                {
                // ...
                }
        }

try {
        // ...
}
catch() {
        // ...
}

올바른 예:

function foo($bar)
{
        // ...
}

foreach ($arr as $key => $val)
{
        // ...
}

if ($foo == $bar)
{
        // ...
}
else
{
        // ...
}

for ($i = 0; $i < 10; $i++)
{
        for ($j = 0; $j < 10; $j++)
        {
                // ...
        }
}

try
{
        // ...
}
catch()
{
        // ...
}

괄호 및 괄호 내 공백

일반적으로 괄호와 대괄호에는 추가 공백을 사용하지 않아야 합니다. 예외는 인수가 있는 괄호를 허용하는 PHP 제어 구조(declare, do-while, elseif, for, foreach, if, switch, while)와 함수를 구분하고 가독성을 높이는 데 도움이 되도록 항상 공백이 따라와야 한다는 것입니다.

잘못된 예:

$arr[ $foo ] = 'foo';

올바른 예:

$arr[$foo] = 'foo'; // 배열 키 주변에 공백 없음

잘못된 예:

function foo ( $bar )
{

}

올바른 예:

function foo($bar) // 함수 선언의 괄호 주변에 공백 없음
{

}

잘못된 예:

foreach( $query->result() as $row )

올바른 예:

foreach ($query->result() as $row) // PHP 제어 구조 뒤에 단일 공백, 내부 괄호에는 없음

지역화 텍스트

CodeIgniter 라이브러리는 가능하면 해당 언어 파일을 활용해야 합니다.

잘못된 예:

return "Invalid Selection";

올바른 예:

return $this->lang->line('invalid_selection');

프라이빗 메소드 및 변수

코드 추상화를 위해 공개 메소드가 사용하는 유틸리티 및 헬퍼 함수와 같이 내부적으로만 접근되는 메소드와 변수에는 밑줄 접두사를 붙여야 합니다.

public function convert_text()
private function _convert_text()

PHP 에러

코드는 에러 없이 실행되어야 하며 이 요구 사항을 충족하기 위해 경고와 알림이 숨겨지는 것에 의존해서는 안 됩니다. 예를 들어 자신이 설정하지 않은 변수(예: $_POST 배열 키)에 먼저 isset()로 확인하지 않고 접근하지 마세요.

모든 사용자에 대해 에러 보고가 활성화된 개발 환경을 사용하고 PHP 환경에서 display_errors가 활성화되어 있는지 확인하세요. 이 설정을 다음으로 확인할 수 있습니다:

if (ini_get('display_errors') == 1)
{
        exit "Enabled";
}

display_errors가 비활성화된 일부 서버에서 php.ini에서 이를 변경할 수 없는 경우 종종 다음으로 활성화할 수 있습니다:

ini_set('display_errors', 1);

참고

런타임에 ini_set()으로 display_errors 설정을 지정하는 것은 PHP 환경에서 활성화된 것과 동일하지 않습니다. 즉, 스크립트에 치명적인 에러가 있는 경우 아무런 효과가 없습니다.

짧은 여는 태그

서버에 short_open_tag가 활성화되어 있지 않을 수 있으므로 항상 전체 PHP 여는 태그를 사용하세요.

잘못된 예:

<? echo $foo; ?>

<?=$foo?>

올바른 예:

<?php echo $foo; ?>

참고

PHP 5.4에서는 항상 <?= 태그를 사용할 수 있습니다.

줄당 하나의 구문

여러 구문을 한 줄에 결합하지 마세요.

잘못된 예:

$foo = 'this'; $bar = 'that'; $bat = str_replace($foo, $bar, $bag);

올바른 예:

$foo = 'this';
$bar = 'that';
$bat = str_replace($foo, $bar, $bag);

문자열

변수를 파싱해야 하는 경우를 제외하고 항상 작은따옴표 문자열을 사용하세요. 변수를 파싱해야 하는 경우 욕심 많은 토큰 파싱을 방지하기 위해 중괄호를 사용하세요. 이스케이프 문자를 사용하지 않아도 되도록 문자열에 작은따옴표가 포함된 경우 큰따옴표 문자열을 사용할 수도 있습니다.

잘못된 예:

"My String"                                     // 변수 파싱 없음, 큰따옴표 사용 불필요
"My string $foo"                                // 중괄호가 필요합니다
'SELECT foo FROM bar WHERE baz = \'bag\''       // 보기 안 좋음

올바른 예:

'My String'
"My string {$foo}"
"SELECT foo FROM bar WHERE baz = 'bag'"

SQL 쿼리

SQL 키워드는 항상 대문자로 작성합니다: SELECT, INSERT, UPDATE, WHERE, AS, JOIN, ON, IN 등.

가독성을 위해 긴 쿼리를 여러 줄로 나누세요. 각 절에서 나누는 것이 좋습니다.

잘못된 예:

// 키워드가 소문자이고 쿼리가 한 줄에 너무 깁니다
// (... 는 행의 연속을 나타냄)
$query = $this->db->query("select foo, bar, baz, foofoo, foobar as raboof, foobaz from exp_pre_email_addresses
...where foo != 'oof' and baz != 'zab' order by foobaz limit 5, 100");

올바른 예:

$query = $this->db->query("SELECT foo, bar, baz, foofoo, foobar AS raboof, foobaz
                                FROM exp_pre_email_addresses
                                WHERE foo != 'oof'
                                AND baz != 'zab'
                                ORDER BY foobaz
                                LIMIT 5, 100");

기본 함수 인수

적절한 경우 함수 인수 기본값을 제공하면 실수로 함수를 호출할 때 PHP 에러를 방지하고 몇 줄의 코드를 절약할 수 있는 공통 폴백 값을 제공하는 데 도움이 됩니다. 예시:

function foo($bar = '', $baz = FALSE)