본문 바로가기
Language/php

코딩 스타일 권장 가이드 (1)

by 잘먹는 개발자 에단 2025. 2. 7.

PSR-1 <Basic Coding Standard> - PHP 코딩 스타일 권장 가이드

 

PSR-1 <Basic Coding Standard>

# **1. Overview** - 파일은 태그 ` PHP 코드는 긴 태그 또는 짧은 에코 태그를 사용해야합니다 . 다른 태그 변형을 사용해서는 안됩니다. `` **…

wikidocs.net

 

- 파일은 php 코드에 BOM없이 UTF-8만 사용해야한다.

- 파일은 <?php와 <?= 태그만 사용해야한다.

- 메서드 이름은 반드시 camelCase로 선언해야 한다.

 

Side Effects

- 빈 구문이 아니라면 반드시 하나의 side effect를 가져야 한다.

*side effect는 실행 중에 어떤 객체를 접근해서 변화가 일어나는 행위를 말한다. 

- 파일은 새로운 기호 ( 클래스, 함수, 상수 )를 선언하고 다른 부작용을 일으키지 않아야하며, 

Side Effect가 있는 로직을 실행해야 하지만, 두가지를 모두 실행해서는 안된다.

(이하 사이드 이펙트)

 

사이드 이펙트에는 출력 생성, 명시적 사용 require 또는 include의 외부 서비스 연결, ini 설정 수정, 오류 또는 예외처리, 전역변수 또는 정적 변수 [수정, 파일 읽기 또는 쓰기] 등이 포함되지만 이에 국한되지는 않는다. 

 

다음은 선언과 사이드 이펙트가 모두 포함된 파일의 예제이다.

 

<?php

// 사이드이펙트 : change ini settings
ini_set('error_reporting', E_ALL);

// 사이드이펙트 : loads a file
include 'file.php';

// 사이드 이펙트 : generates output
echo '<html>\n';

// declaration
function foo(){
	// function body
}

 

 

 

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

- 클래스 상수

클래스 상수는 밑줄 구분 기호로 모든 대문자에서 선언되어야 한다.

<?php
namespace Vendor\Model;

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

 

 

코딩 스타일

파일

- 모든 php 파일은 Unix LF(linefeed) 줄 끝을 사용해야 한다.

- 모든 php 파일은 하나의 빈 줄로 끝나야 한다.

- 닫기 ?> 태그는 php만 포함된 파일에서 생략해야한다. 무.조.건

 

라인

- 라인 길이에 엄격한 제한이 있으면 안된다.

- 줄 길이에 대한 소프트 제한은 120자 정도이다. 왠만하면 넘기지 말자

- 행은 80자를 넘기 않는 것이 좋다. 그보다 길다면 여러 행으로 나눠져야 한다.

- 비어있지 않은 줄의 끝에는 공백 문자가 없어야 한다.

- 가독성을 높이고 관련 코드 블록을 나타내기 위해서 빈 줄을 추가할 수 이싿.

- 한 줄에 하나 이상의 문장이 있어서는 안된다.

 

키워드 / True / False / Null

- php 키워드는 소문자여야 한다. php 상수, true, false, null은 소문자로 

 

네임스페이스, Use 선언

- namespace 선언 다음에는 빈 줄을 한 줄 삽입해야한다.

- use 선언이 존재한다면 모든 선언은 반드시 그 선언을 따라야 한다.

- use 선언 1개에는 1개의 키워드가 들어간다.

- use 블록 다음에 빈 줄이 하나 들어가야 한다.

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}

 

 

클래스, 프로퍼티, 메서드

- 클래스는 객체의 상태를 나타내는 필드와 객체의 행동을 나타내는 메서드로 구성된다.

- 필드란 클래스에 포함된 변수를 의미한다.

- 메서드란 어떤 특정 작업을 수행하기 위한 명령문의 집합이라고 할 수 있다.

 

 

Extends and Implements

- extends 및 implements 키워드는 클래스 이름과 같은 줄에 선언해야 한다.

- 해당 클래스의 여는 중괄호는 자체 줄에 있어야 한다. 클래스의 닫는 중괄호는 본문 뒤의 다음 줄로 가야 한다. 

<?php

namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements \ArrayAccess, \Countable
{
    // constants, properties, methods
}

 

목록은 implements 각각의 후속 행 일단 들여되는 여러 줄에 걸쳐 분할 될 수 있다. 

그렇게 할 때 목록의 첫번째 항목은 다음 줄에 있어야 하며, 한 줄에 하나의 인터페이스만 있어야 한다. 

<?php
namespace Vendor\Package;

use FooClass;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;

class ClassName extends ParentClass implements
    \ArrayAccess,
    \Countable,
    \Serializable
{
    // constants, properties, methods
}

 

 

클래스 프로퍼티

- 모든 속성에서 가시성을 반드시 선언해야한다. 

- var 키워드가 속성을 선언하는데에 사용되어서는 안된다.

- 명령문마다 하나 이상의 속성이 선언되어서는 안된다.

- 프로퍼티 이름은 protected private 또는 private 가시성을 나타내기 위해서 하나의 밑줄로 접두어를 사용해서는 안된다.

// 속성선언
<?php
namespace Vendor\Package;

class ClassName
{
    public $foo = null;
}

 

메서드

- 모든 메서드에서 가시성을 선언해야한다. 무조건

- 메서드 이름은 protected 이거나 private 가시성을 나타내기 위해서 하나의 밑줄로 (_) 접두어를 해서는 안된다.

- 메서드 이름은 메서드 이름 다음에 공백으로 선언하면 안된다.

- 메서드 인수

    ㄴ 인수 목록에서 각 쉼표 앞에 공백이 있으면 안되며, 각 쉼표 뒤에 하나의 공백이 있어야 한다.

    ㄴ 디폴트 값을 가진 메서드 인수는 인수 목록의 맨 끝에 놓는다. 

<?php
namespace Vendor\Package;

class ClassName
{
    public function foo($arg1, &$arg2, $arg3 = [])
    {
        // method body
    }
}

 

    ㄴ 인수 목록은 여러줄에 걸쳐서 나뉘어질 수 있다. 

    ㄴ 각 줄은 한 번 들여 쓰여질 수 있다.

    ㄴ 목록의 첫번 째 항목은 다음 줄에 있어야 하며, 한 줄에 하나의 인수만 있어야 한다.

    ㄴ 인수 목록이 여러 줄에 걸쳐서 분할되어 있다면, 닫는 괄호와 여는 중괄호는 한 줄의 공백을 사용하여 각각의 줄에 함께 있어야 한다. 

<?php
namespace Vendor\Package;

class ClassName
{
    public function aVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 = []
    ) {
        // method body
    }
}

 

abstract, final, static

- 존재하는 경우, abstract 및 final 선언은 가시성 선언 앞에 와야한다. 무조건

- 현재 static 선언이 가시성 선언 되에 와야한다.

<?php
namespace Vendor\Package;

abstract class ClassName
{
    protected static $foo;

    abstract protected function zim();

    final public static function bar()
    {
        // method body
    }
}

 

 

메서드, 함수 호출

- 메서드나 함수 호출을 할 때 메서드나 함수 이름과 여는 괄호 사이에 공백이 없어야 한다.

- 여는 괄호 뒤에 공백이 있으면 안되며 닫는 괄호 앞에 공백이 있으면 안된다. 

- 인수 목록에서 각 쉼표 앞에 공백이 있으면 안되며, 각 쉼표 뒤에 하나의 공백이 있어야 한다. 

<?php
bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);

 

 

 

* php에서의 use

- php에서의 use 키워드의 주된 역할은 네임스페이스 및 트레이트를 불러오는 것이다.

- php에서는 네임스페이스를 사용하여 클래스, 함수, 상수를 그룹화할 수 있다.

- use를 활용하면 긴 네임스페이스를 줄여서 사용할 수 있다.

 

예시 1 : 네임스페이스 사용없이 직접 접근하기

namespace App\Controllers;

class HomeController {
    public function index() {
        echo "HomeController";
    }
}


require 'HomeController.php';

// 네임스페이스가 있는 클래스를 직접 호출하려면 전체 경로를 써야 함
$controller = new \App\Controllers\HomeController();
$controller->index();

 

예시 2 : use 를 활용하여 네임스페이스 줄이기

require 'HomeController.php';

use App\Controllers\HomeController;

$controller = new HomeController(); // 짧게 사용 가능!
$controller->index();

 

예시 3 : as를 사용한 별칭 alias

- 클래스 이름이 겹치거나 더 짧게 사용하고 싶을 때 as 키워드를 활용하여 별칭을 줄 수 있다.

use App\Controllers\HomeController as HC;

$controller = new HC(); // HomeController 대신 HC로 사용
$controller->index();

 

 

 

트레이트에서의 use 의 역할

- 트레이트 Trait 는 php에서 다중 상속이 불가능한 문제를해결하기 위해서 제공되는 기능이다.

- use를 사용하면 클래스에서 트레이트의 메서드를 가져와서 사용할 수 있다. 

 

*단, 

- html 내에서 use 키워드는 사용할 수 없다.

- 참고로 $this는 객체에서만 사용가능하다. 

- trait은 단독으로 사용할 수 없고, 클래스에서 use로 가져와야한다. 

 

trait Logger {
    public function log($message) {
        echo "[LOG]: " . $message;
    }
}

class User {
    use Logger; // 트레이트 사용

    public function createUser() {
        $this->log("새로운 사용자가 생성됨.");
    }
}

$user = new User();
$user->createUser(); // 출력: [LOG]: 새로운 사용자가 생성됨.

use Logger;를 사용하여 log() 메서드를 클래스 내에서 바로 사용할 수 있다.

 

 

예시 2 : 여러개의 트레이트 사용

trait Logger {
    public function log($message) {
        echo "[LOG]: " . $message;
    }
}

trait Notifier {
    public function notify($message) {
        echo "[NOTIFY]: " . $message;
    }
}

class Admin {
    use Logger, Notifier; // 여러 개의 트레이트 사용 가능

    public function sendAlert() {
        $this->log("관리자 알림 발송");
        $this->notify("사용자에게 알림 전송");
    }
}

$admin = new Admin();
$admin->sendAlert();
// 출력:
// [LOG]: 관리자 알림 발송
// [NOTIFY]: 사용자에게 알림 전송

use Logger, Notifier;를 활용하여 다중 트레이트를 사용할 수도 있다. 

 

 

예시 3 : 클로저에서 use를 사용하여 외부 변수 참조

$greeting = "Hello";

$helloFunction = function($name) use ($greeting) {
    echo "$greeting, $name!";
};

$helloFunction("PHP"); // 출력: Hello, PHP!

$greeting은 함수 바깥의 변수이지만, use ($greeting)을 사용하면 내부에서 사용할 수 있다. 

 

 

 

** 본 게시글은 PSR-1 <Basic Coding Standard> - PHP 코딩 스타일 권장 가이드 전자책을 참고하였습니다.

 

PSR-1 <Basic Coding Standard>

# **1. Overview** - 파일은 태그 ` PHP 코드는 긴 태그 또는 짧은 에코 태그를 사용해야합니다 . 다른 태그 변형을 사용해서는 안됩니다. `` **…

wikidocs.net

 

 

 

 

'Language > php' 카테고리의 다른 글

도커와 라라벨  (0) 2025.03.14
코딩 스타일 권장 가이드(2)  (0) 2025.02.07
디자인 패턴  (0) 2025.02.04
PRG 패턴  (0) 2025.01.31
FILTER ! : 외부에서 온 데이터는 검증해야 한다.  (0) 2025.01.31