PHP 네임스페이스 namespaces

2022. 5. 2. 14:35PHP

728x90

http://berlinonline.github.io/php-introduction/chapters/namespaces_and_autoloading/

 

네임스페이스(Namespaces)
지금까지 class와 function들은 애플리케이션 내에서 떠돌아다녔고, 우리는 이름을 통하여 그것들을 호출할 수 있었다. 구조가 복잡한 프로젝트의 경우에는 이 점때문에 골치가 아파진다. 특히 비슷한 기능을 하는, 비슷한 이름을 가진 다수개의 class가 존재한다고 가정해보자. 3rd party libraries의 코드와 이름 충돌(name collision)이 발생할 수도 있다. 예를 들어 'Address'라는 class를 작성하여 사용하는데 다른 library에서도 'Address'라는 이름을 사용할 경우가 발생할 수 있다. 그런 경우, PHP는 어느 쪽의 'Address' class를 사용할지 어떻게 결정할까?

코드의 이름 충돌을 방지하고 코드를 정리하기 위해 class와 function들을 네임스페이스에 담아 쓴다.
네임스페이스는 코드의 실제 파일 위치와 직결된다.

 

<?php
//file name: src/MyProject/Foo/Derp.php

namespace "MyProject\Foo";

class Derp
{
  //...
}

 


네임스페이스는 네임스페이스를 선언(declaration)한 PHP 파일 전체에 적용된다. 해당 파일 안에 있는 모든 내용은 MyPrject\Foo 네임스페이스에 담긴다.

우리가 src라는 디렉토리를 갖고 있음에도 src 네임스페이스가 없는 이유는 src 디렉토리가 모든 네임스페이스의 최상위 레벨인 글로벌(전역) 네임스페이스를 포함하고 있기 대문이다. 그.. Composer 선생님께서 그렇게 되게 해주신다. (모든 프로젝트는 composer.json을 가져야만 한다.)

 

 

오토로드(Autoloading)
composer.json에 autoload 섹션을 추가함으로써 Composer에게 'src 디렉토리는 모든 것을 담고 있다'고 알려줄 수 있다.

하기의 코드는 'src 디렉토리 안에서 하위 디렉토리가 곧 네임스페이스이며, php 파일들은 class 파일이다'고 말하고 있다.

 

 

{
    "name": "lnwdr/my-project",
    "authors": [
        {
            "name": "Leon Weidauer",
            "email": "leon@lnwdr.de"
        }
    ],
    "require": {},
    "autoload": {
        "psr-4": { "": "src/" }
    }
}

 

오토로드는 일일이 require를 쓸 필요 없이 자동적으로 class, 연관 파일들을 찾는 방법이다.
PHP 코드가 대개 class 단위로 작성되는 이유는 PHP는 오직 class에게만 오토로드를 허락하기 때문이다.

아무튼 여기까지 했으면 PHP 프로그램 안에 Composer autoload.php를 문서에 포함시키면 된다.

 

<?php

require "vendor/autoload.php";

 

상기의 코드 한 줄은 메인 코드의 최상단에 써야 한다. 그래야 필요한 모든 class들이 프로그램 실행시에 찾아질 수 있기 때문이다.



네임스페이스의 사용

use 키워드를 사용함으로써 다른 네임스페이스를 현재 범위로 끌고 올 수 있다.
use 코드를 상단에 모아서 써두면 약간 다큐멘테이션스럽기도 하고 좋다.

 

<?php
//file name: app.php

use MyProject\Foo;

$d = new Derp();

 

 

728x90
반응형