- 일러두기: 이 규칙은 리눅스코리아 노미넘사업팀에서 사용하는 규정이며, 그 이상의 의미를 갖지 않습니다. 본문에 대해서는 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]
- 전역변수와 템플릿 변수는 충돌을 피하기 위해 간단한 단어로는 쓸 수 없다.
- 함수의 이름은 가급적이면 "동사" 또는 "동사_명사" 또는 "카테고리_동사_명사" 로 하며, 함수 이름과 하는 일은 반드시 일치해야하며, 용도가 중간에 변하는 경우에는 반드시 함수 이름을 바꾼다.
- 함수 이름에는 대문자를 사용하지 않는다.
- 클래스의 이름은 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을 통해서 전달되는 폼 변수 등은 신뢰하지 않으며, 반드시 재검사하거나 서버측에 저장되는 세션을 통하여 전달한다.
- 이 문서에 표시되지 않은 규칙에 대해서는 해당 소스 코드에서 기존에 사용하던 스타일을 따라야 한다.
댓글 없음:
댓글 쓰기