psr - code convention
DESCRIPTION
Code Convention을 위한 PSR에 대한 설명입니다.TRANSCRIPT
PSRCode Convention
조정현 , XE Team
PSR? Code Convention?
• Code Convention : 프로그램 코드를 작성할때 지켜야 하는 가이드라인
• PSR : Code Convention 룰 중에 하나
이게 무엇인고 하니
코드 작성할때 룰에 맞춰서 해 !!라고 어느정도의 강제를 하는겁니다 ..
왜 ?
개발자가 많은 만큼 코딩 스타일도 다양합니다 .
다들 이런경험 한번씩 있지 않나요 ?
다른사람이 작성한 소스 보고 ..• 보기 불편해 T^T
• 어우 .. 못 알아 보겠어 T^T
• 왜 이렇게 짯데 ? T^T
• 아놔 못해먹네 ㅡㅡ
왜 ?
소스코드가 눈에 익지 않아 불필요하게 소진되는 비용을 최소화 하여 생산성을 높이는데 그 목적이 있다고 할 수 있습니다 .
꼭 지켜야 하나 ? 개개인 별로 진행하는 소규모 프로젝트를 진행하는 개발자들은 필요성을 못 느낄수도 있습니다 .
“ 지금까지 하던대로 익숙한 방식으로 하는게 더 빠른데 ?”
그러나 ! 그 프로젝트를 본인이 죽는 그날까지 맡아서 한다고 보장할 수 있나요 ? 내가 작성한걸 다른사람이 유지보수 할 수도 있고 , 반대로 다른사람이 제작한 프로그램을 내가 유지보수 할 수도 있습니다 .
꼭 지켜야 하나 ?
또한 어느정도 이상 규모의 프로젝트 진행시에는 여러 사람이 협업을 하게 되므로 가독성을 높여 생산성을 증가시키는 행위는 반드시 필요한 부분입니다 .
PSR
• 앞서 말한바와 같이 PSR 은 Code Convention 룰 입니다 .• 여러 프로그래밍 언어중 PHP 에만 적용되는 룰입니다 .• 코딩 가이드만 제시하는 것은 아니고 Auto Loading 과
Log Interface 를 포함하고 있습니다 .• PSR 은 0 부터 4 까지가 존재하며 이중 1, 2 번 내용이
코딩 가이드 라인을 지칭합니다 .
How to
Code Convention 에 해당하는 PSR1, 2 를 집중적으로 살펴보겠습니다 .
How to PSR-1
PSR-1 표준 기본 코딩
요약• PHP 태그는 반드시 <?php 와 <?= 만 사용 함• 파일의 인코딩은 UTF-8 만 사용• 하나의 파일에선 class, function, constant 등을 선언하거나 출력 ,
ini 설정변경 등을 수행하지만 두가지가 동시에 수행되서는 안됨• Class 명은 각 음절의 첫문자를 대문자로 표기• 상수는 대문자와 “ _” 의 조합으로 선언• Method 는 각 음절의 첫문자를 대문자로 표기하지만 첫 문자는 소문자로
표기
How to PSR-1
<?phpini_set(‘error_reporting’, E_ALL);Include ‘filename.php’;echo ‘hello world’;function foo(){
// do something}
class FooClass{ const DOMAIN = ‘www.sample.com’; function barMethod() { // function body }}
Class 가 선언된 파일에서는 이런요소가 같이포함되어 있으면 안됩니다 . 별도 파일에 작성해야합니다 .
파일 시작 태그는 php 문구를 생략하지 않고 작성
닫는 태그는 작성하지 않습니다 .
클래스명은 각 음절 첫글자를 대문자로
상수는 대문자와 “ _” 만 사용
메소드는 각 음절 첫글자를 대문자로 하지만 맨 앞 글자는 소문자
How to PSR-1
기타 사항• Namespace 는 PHP 5.3 이상 버전에서만 사용가능하며 룰은 PSR-0
을 따릅니다 .• 변수명의 형식은 “ $StudlyCaps”, “$camelCase”,
“$under_score” 등의 형식으로 작성할 수 있지만 기준을 정하여 하나의 형식으로 맞춰 써야합니다 . 협업 하시는 분들이 계시다면 상의 하여 결정하면 되겠죠 ?
• http://www.php-fig.org/psr/psr-1/
How to PSR-2
PSR-2 코딩 스타일 가이드
요약• PSR-1 을 기본으로 합니다 .• 들여쓰기는 “탭”을 사용하지 않고 “스페이스” 4 번으로 합니다 .• 한줄의 길이는 80 자 정도로 권장하지만 강제하지는 않습니다 .• namespace 가 선언되었다면 그 다음 줄은 반드시 빈 줄이어야 합니다 .• use 를 사용시에도 마찬가지로 다음 줄은 빈줄이어야 합니다 .• class 와 method 를 여는 중괄호는 해당 이름 다음줄에 위치해야 하고 닫는
중괄호는 내용의 다음 줄에 위치해야합니다 .
How to PSR-2
• method 의 접근 제어자는 반드시 명시되어야 합니다 .(public, protected, private)
• abstract, final 은 접근제어자 앞에 있어야 하고 static 은 뒤에 있어야 합니다 .• 제어구조문 (if, switch, for 등등 ) 을 여는 중괄호는 해당 구문과 같은줄에 있어야
하고 닫는중괄호는 내용의 다음줄에 있어야 합니다 .• 제어구조문 여는 소괄호앞에는 한 칸의 공백이 있어야 하고 뒤에는 공백이 없어야
하며 닫는 소괄호는 반대로 앞에는 공백이 없어야 하고 뒤에는 한 칸의 공백이 있어야 합니다 .
• method 인자를 담는 소괄호는 앞 , 뒤에 공백이 없어야 합니다 .• 각 줄에 내용이 끝난 이후에는 공백이 없어야 합니다 .
• http://www.php-fig.org/psr/psr-2/
How to PSR-2
먼 소린가 싶으시죠 ?예시를 보시면 쉽게 알 수 있습니다 .
How to PSR-2
<?phpnamespace Vendor\Package;
use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface{ public function sampleMethod($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } }
filnal public static function bar() { }}
namespace 다음 공백 줄
use 다음 공백 줄
들여쓰기 한 깊이당 스페이스 4번
class, method 여는 중괄호는 다음줄에
조건제어절 여는 중괄호는 같은줄에
elseif 는 붙여서
괄호 안쪽에 공백 없게 , 쉼표뒤엔 한칸 공백
접근제어자 명시 , final 은 앞에 , static 은 뒤에
닫는 중괄호는 항상 다음줄에
✔✔
✔
How to PSR-2
<?phpswitch ($expr) { case 0: echo ‘first case’; break; case 1: echo ‘hello’; // no break case 2: case 3: return false; default: echo ‘default case’; break;}
for ($i = 0; $i < 10; $i++) {}
foreach ($iterable as $key => $value) {}
true, false, null 은 소문자로
break 없는 구분은 주석 표기
✔✔
✔✔✔ ✔
✔ ✔
✔ ✔
How to PSR-2
<?phpclass ClassName extends ParentClass implements ArrayAccess, Countable, Serializable{ protected $foo;
public function Bar($arg1, $arg2, $arg3 = null) { $zim->bas( $arg1, $arg2, $arg3 ); }}
extends, implements 여러개라 줄바꿈을 하고 싶다면 한줄에 한개만 표기 , 한 번의 들여쓰기가 되어야 함
여는 중괄호는 다음줄에
var 는 사용하지 않음 public, protected, private 만 사용
method, function 호출시에도 인자값이 여러개라 줄바꿈을 하고 싶다면 한줄에 한개만 표기 , 한 번의 들여쓰기가 되어야 함
인자중 default 값이 있는것은 뒤쪽에 배치
How to PSR-2
<?phptry {} catch (FirstExceptionType $e) {} catch (OtherExceptionType $e) {}
while ($expr) {}
do {} while ($expr);
✔
✔ ✔ ✔
✔ ✔ ✔
✔ ✔
✔
✔✔
How to PSR-2
<?php$closure = function ($arg1, $arg2) {};
$closure = function ($arg1, $arg2) use ($var1, $var2) {}
$closure = function ( $arg1, $arg2, $arg3) {}
$closure = function () use ( $var1, $var2, $var3) {}
클로저는 조건제어문과 같이 여는 중괄호를 같은 줄에 표기
인자값이 여러개라 줄바꿈을 하고 싶다면 한줄에 한개만 표기 , 한 번의 들여쓰기가 되어야 함
✔✔✔
How to PSR-2
<?php$closure = function ( $arg1, $arg2, $arg3) use ( $var1, $var2, $var3) {}
$closure = function ( $arg1, $arg2 $arg3) use ($var) {}
$closure = function ($arg) use ( $var1, $var2, $var3) {}
이럴때도 마찬가지로 한줄에 한개만 표기
$foo->bar( $arg1, function ($arg) use ($var) { }, $arg3);
method, function 호출 인자에 클로저가 들어갈때는 한줄에 각 인자 하나씩만 오도록 작성
ETC• PSR-0, 4 는 auto Loading 을 위한 형식에 대한
규격입니다 .
기본은 namespace 구분자는 디렉토리 구분자로 변경된다는 것입니다 .그러나 “ -” 로 연결된 하나의 디렉토리로 만들수도 있습니다 .가장 중요한건 class 명과 파일명을 일치시켜야 한다는 것입니다 .
class 명 접두사 기본 디렉토리 파일 경로
\Acme\Log\Writer\File_Writer Acme\Log\Writer ./acme-log-writer/lib/ ./acme-log-writer/lib/File_Writer.php
\Aura\Web\Response\Status Aura\Web /path/to/aura-web/src/ /path/to/aura-web/src/Response/Status.php
\Symfony\Core\Request Symfony\Core ./vendor/Symfony/Core/ ./vendor/Symfony/Core/Request.php
\Zend\Acl Zend /usr/includes/Zend/ /usr/includes/Zend/Acl.php
ETC• PSR-3 은 Logger Interface 에 대한 내용입니다 .
• http://www.php-fig.org 에 방문 하시면 더 많은 정보를 얻을 수 있습니다 .
로그 표현 레벨은 8 가지로 고정 되고 , 메시지는 지정된 문자열에 키워드만 치환되어 표현하는 방식으로 이루어져야 합니다 .Psr/Log 를 상속받아 구현되는 것을 명시하고 있습니다 .
* Log level : debug, info, notice, warning, error, critical, alert, emergency
End.