2006년 5월 26일 금요일

PHP 코딩 규정

PHP 코딩 규정
  • 일러두기: 이 규칙은 리눅스코리아 노미넘사업팀에서 사용하는 규정이며, 그 이상의 의미를 갖지 않습니다. 본문에 대해서는 libpng/zlib 라이선스의 조건으로 재사용하실 수 있습니다.

파일 형식에 대한 규칙

  • 모든 소스 파일은 UTF-8 인코딩을 사용하며, 특별히 다른 인코딩의 아웃풋이 필요한 경우에 한해서 다른 인코딩으로 작성될 수 있다.
  • 모든 소스 파일은 79컬럼에 맞춰서 줄 넘김 해야 하며, 문법 구조 상 줄넘김이 불가능한 경우에 한해서 그 이상으로 작성할 수 있다.
  • 모든 소스 파일은 LF로 줄넘김되어야 하며, MIME Text 등 특수한 경우에 한하여 CR LF 줄넘김을 할 수 있다.
  • Makefile을 제외한 모든 문법의 파일에서 Tab문자는 Space로 항상 풀어 쓰며, 절대로 섞일 수 없다.
  • 특별히 구조상 필요한 경우를 제외하고는, 줄 끝에는 공백이 올 수 없다.

코드 스타일 가이드라인

  • 들여쓰기는 반드시 스페이스 4개로 하며, 탭은 풀어쓴다. ex: ts=8 sts=4 sw=4 et
  • php코드의 시작 부분은 반드시 로 쓴다.
  • php 조건 블럭이나 루프 블럭 사이에는 php코드를 닫지 않는다.

[code]
// 이렇게 쓰는 것은 금지
<?php
if ($condition) {
   ?>hello<?php
}
?>

[/code]

  • class, function 뒤에 오는 { 는 다음 줄의 같은 컬럼에 쓴다.

[code]
function funcname($a, $b)
{
   do_something();
}

[/code]

  • if, while, for, foreach 등 다른 경우에는 {는 줄의 끝에 쓴다.

[code]
if ($condition) {
   do_something();
   return false;
}
[/code]

  • if, while, for, foreach 블럭에서 블럭 안에 절이 1개만 있는 경우에는 괄호로 감싸지 않는다.

[code]
if ($condition) // 맞음
   do_something();

if ($condition) { // 틀림
   do_something();
}
[/code]

  • else는 이전 }의 다음 줄에 쓰며, elseif는 항상 else if로 띄어쓴다.

[code]
if ($condition) {
   yay();
   nada();
}
else if ($another) {
   yay();
   nada();
}

[/code]

  • ++와 --, ->, [], . 연산자는 앞뒤로 붙여쓰며 그 외의 모든 연산자는 앞 뒤를 띄어 쓴다.

[code]
$a++;
$a + 1;
$a[5 + $b] - 7;
$a.$b;
[/code]

  • 대입하는 = 앞뒤로는 모두 띄어쓴다.

[code]
$a = $b;
[/code]

  • 함수의 인자 목록의 괄호는 함수 이름에 붙여 쓰며 괄호 바로 뒤와, 괄호 바로 앞은 띄어쓰지 않고, 매 인자 사이의 쉼표 뒤에는 띄어 쓰며, 디폴트 인자들은 = 앞뒤로 붙여쓴다.

[code]
function funcname($a, $b, $c=123)
{
   test;
}
[/code]

  • 함수 호출 시의 인자도 위와 같은 방법으로 쓴다.

[code]
$ret = funcname(123, 456);
[/code]

  • if, while 등의 조건 제어 블럭의 키워드 뒤에는 한 칸을 띄며, for문의 ; 뒤에는 한 칸씩을 띄어 쓴다.

[code]
if ($test == 1) {
}
for ($a = 1; $a < 5; $a++) {
}
[/code]

  • if, while 등의 조건절이 길어서 여러 줄로 넘어가는 경우에는, &&또는 등의 논리 연산자로 각 줄을 종료하며, 조건절의 다음 줄은 2단계 더 들어가서 시작한다.

[code]
if ($a_variable_with_very_long_name >= 12345678 &&
       $another_variable_with_very_long_name >= 3.141592) {
   statement;
}
[/code]

  • switch-case에서 case는 switch와 같은 줄로 들여쓴다.

[code]
switch ($b) {
case 1:
   do_something;
   break;
default:
   break;
}
[/code]

  • switch-case에서 코드가 있는 case에서 break또는 return없이 다음 case로 중첩되는 경우에는 // FALLTHROUGH 표시를 한다.

[code]
switch ($b) {
case 1:
   do_something();
   // FALLTHROUGH
case 2:
   do_anything();
   break;
}

switch ($b) {
case 1:     // 코드가 없이 case가 연속되면 표시 안 함
case 2:
   do_something();
   break;
}
[/code]

  • 주석은 같은 줄에 설명하는 경우에는 // 표시로 뒤에 쓰며, 같은 줄에 설명할 공간이 부족한 경우에는 앞에 쓴다. 여러 줄인 경우에는 //를 쓰지 않고 /* */를 사용한다.

[code]
$girl = 'test'; // 그냥 테스트

/* 이히히..
* 다시.. */
$girl = 'test2';
[/code]

  • include는 사용하지 않고 require_once만 사용한다. (꼭 필요한 경우 require 사용 가능)
  • 전역변수 선언은 함수의 처음에만 한다.
  • Array 선언에서 여러 개의 인자를 넣는 경우에는 다음과 같이 띄어서 쓴다. (인자가 1개인 경우에는 한 줄로 쓰기 가능, A는 대문자)

[code]
$a = Array(
   'a' => 'b',
   'c' => 'd',
);
[/code]

  • return, require 등의 키워드 뒤에는 ()로 감싸지 않는다.

[code]
require "xxx.php";
return 123;

[/code]

  • 여러 줄의 긴 문자열을 쓰는 경우, . 연산자를 끝에 써서 붙이거나, <<<EOF 방식을 사용하며, 닫히지 않은 긴 문자열은 사용하지 않는다. .으로 붙이는 경우에는 첫줄의 스트링 시작에 맞춰서 들여쓴다.

[code]
$x = "무지 긴 스트링 이라서 다음 줄에 연달아 써야 하는 ".
    "경우에는 이렇게".
    "씁니다.";

$x = <<<EOS
이렇게도 쓸 수 있습니다.
EOS;

$x = "
이렇게는 안 씁니다.
";
[/code]

  • 문자열 내 $치환의 앞뒤로는 반드시 {}로 감싸준다.

[code]
$x = "{$name}님 안녕하세요.";
[/code]

  • 선언되지 않은 변수나 문자열을 따옴표로 감싸지 않는 등의, 경고가 발생할 수 있는 코드는 사용할 수 없다.

[code]
$x[key]; // 는 $x['key']로

if ($have_something) // $have_something이 선언되지 않을 경우가 있다면
if (isset($have_something) && $have_something) // 이렇게
[/code]

  • assert는 함수처럼 사용한다.

[code]
assert $x == 1; // 틀림
assert($x == 1); // 맞음
[/code]

PHP 코드 명명 규칙
  • 전역변수와 템플릿 변수는 충돌을 피하기 위해 간단한 단어로는 쓸 수 없다.
  • 함수의 이름은 가급적이면 "동사" 또는 "동사_명사" 또는 "카테고리_동사_명사" 로 하며, 함수 이름과 하는 일은 반드시 일치해야하며, 용도가 중간에 변하는 경우에는 반드시 함수 이름을 바꾼다.
  • 함수 이름에는 대문자를 사용하지 않는다.
  • 클래스의 이름은 CamelCased로 명명한다.
  • 클래스의 메쏘드 이름은 함수 이름 명명 규칙과 같이 한다.
  • 전역 변수의 이름은 의미 없는 짧은 것을 사용할 수 없다.
  • 15줄 내외의 짧은 루프 안에서 사용되는 지역 변수는 1~2자의 짧은 이름을 사용할 수 있다.
  • 루프 변수의 이름은 4줄 내의 아주 짧은 1중 루프인 경우에만 1글자 이름을 사용하며, 그 이상의 루프에서는 단어로 된 2글자 이상의 변수 이름을 쓴다.

코딩 전략 가이드라인

  • 여러 군데에서 사용되는 루틴이 3회 이상 중복 사용되는 경우에는 절대로 붙여넣기를 할 수 없으며, 3번째부터는 반드시 공통된 함수 또는 클래스로 빼내야 한다.
  • 코드는 논리적으로 어느 정도 연속성이 있는 단락으로 문단 구분이 되어야 하며, 하는 역할이 매우 사소하거나 극히 명백한 경우를 제외하고는 각 문단의 앞에 주석으로 하는 역할을 표시한다.
  • PHP 기본 함수 중, Array()를 제외한 모든 함수는 소문자로만 쓰는 것을 원칙으로 하며, 대문자로 쓰는 것을 의도하고 명명된 API인 경우에는 대문자를 섞어쓴다.
  • 임시로 변조하거나 제거하는 코드는 원래의 코드를 주석처리한 것을 앞쪽에 놓고, 날짜, 이유, 작업자 이름 등을 기록한다.

[code]
// 2005-04-30 노마: 앞 뒤로 공백을 생략하지 말고 그냥 보여달라고 해서 임시로..
// $x = trim($hello);
$x = $hello;
[/code]

  • 임시로 땜빵해 둔 곳의 코드에는 // XXX 표시를 한다.
  • 앞으로 수정할 것이 더 있거나 개선할 여지가 있는 부분에는 // TODO 표시를 하고 그 뒤에 이유나 정보를 쓴다.
  • PHP 표준 함수에서 이미 제공하고 있는 기능은 임의로 만든 함수를 사용하지 않고 표준 라이브러리의 함수를 이용한다.
  • 변수나 상수 값이 제한적일 때에만 정상 동작할 수 있는 코드의 앞부분에는 반드시 assert 문으로 값의 범위가 어떤지 표시한다.
  • $_POST, $_SERVER, $_GET 등의 PHP에서 제공되는 내부 변수의 경우에는 절대로 지역적인 코드에서 직접 사용될 수 없으며, 라이브러리 차원에서 추상화되어 간접적으로 제공되어야 한다.
  • 쿠키와 HTML을 통해서 전달되는 폼 변수 등은 신뢰하지 않으며, 반드시 재검사하거나 서버측에 저장되는 세션을 통하여 전달한다.
  • 이 문서에 표시되지 않은 규칙에 대해서는 해당 소스 코드에서 기존에 사용하던 스타일을 따라야 한다.

댓글 없음:

댓글 쓰기