pageinfo | |
---|---|
status | Need Revision |
<!DOCTYPE markdown>
PHP
모던 PHP 개념
Namespace
PHP에서 namespace를 사용하는 목적은, 다른 언어와 마찬가지로 여러 클래스나 함수 등을 재사용하기 위해서다. 특히, 크게 두 가지 목적을 갖는다.
- 사용자 생성 코드와 내부/서드파티 클래스/함수/상수 등을 구별하기 위함
- 1번 문제를 해결하는 과정에서 클래스/함수/상수 등의 이름이 너무 길어지는 현상을 방지하고, 더 짧게 대체하거나 줄이기 위함
정의
하나의 네임스페이스가 하나의 파일에서만 정의될 필요는 없으며, 네임스페이스와 동일한 파일명을 가질 필요도 없다. 반대로 하나의 파일에서 여러 개의 네임스페이스를 정의하는 것도 가능하다. 네임스페이스에 종속되는 요소는 클래스, 인터페이스, 함수, 상수의 네 가지다. 네임스페이스는 파일 맨 앞에 namespace <namespace_name>
형식으로 명시한다. 즉 해당 라인과 <?php
사이에는 declare
외에는 어떠한 코드도 허용되지 않는다. 다만 php 블록 위에 HTML 등의 다른 스크립트가 오는 것은 상관없다. 네임스페이스는 <namespace_name>\<subnamespace_name>\<subsubnamespace_name>\...
식으로 그 계층구조를 명시할 수 있다. 인터페이스/클래스/함수/상수 등도 동일한 규칙을 따른다. 즉 namespcae
네임스페이스 내의 class
클래스를 호출할 경우, namespace\class
형태로 호출할 수 있다. 만약 하나의 파일에 여러 네임스페이스에 대한 정의를 담을 경우, 각 네임스페이스마다 중괄호로 블록을 형성하는 것을 권장한다. 그렇게 하지 않아도 상관없으나, 가독성 차원에서 추천하지 않는다.
<?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace AnotherProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } ?>
사용
PHP에서 namespace를 사용하는 방식은 PHP가 파일을 다루는 규칙(상대경로 / 절대경로)와 유사하다.
- 상대경로: 현재 네임스페이스 (또는 다른 파일에 정의된 하위 네임스페이스)에 정의된 클래스 등을 사용할 경우, 현재 네임스페이스의 이름을 생략할 수 있다.
- 절대경로: 네임스페이스의 full path를 명시한다.
<?php namespace Foo\Bar; include 'file1.php'; const FOO = 2; function foo() {} class foo { static function staticmethod() {} } /* Unqualified name */ foo(); // resolves to function Foo\Bar\foo foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod echo FOO; // resolves to constant Foo\Bar\FOO /* Qualified name */ subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo, // method staticmethod echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO /* Fully qualified name */ \Foo\Bar\foo(); // resolves to function Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO ?>
Backlinks