Namespace
는 모던 php의 근간을 이루는 부분이기 때문에 매우 중요하다.
class와 객체 기초
, Abstraction
에 이어서 PHP OOP에서 가장 중요함.
- 그 외의 것들은 사실 부가적인 부분이다.
- 여러 package에서 쓰는 class의 이름이 겹칠때, Namespace로 이를 구분할 수 있다.
- Namespace autoloading 개념이 나오는데 매우 중요하다.
- 원래는 한 소스 파일당 하나의 namespace를 사용하지만, 여기서는 편의를 위해서 한 파일안에서 여러 namespace를 정의하여 사용해볼 것이다.
Example 1 : 기본 namespace 예제
namespace N1
{
class A
{
public function foo() {
echo __METHOD__ . "\n";
}
}
}
namespace N2
{
class A
{
public function foo() {
echo __METHOD__ . "\n";
}
}
}
namespace
{
use N1\A ;
$a = new A();
$a->foo();
}
- 위 코드의 결과로
use N1\A
를 했을 경우, N1\A::foo
가 출력 되고
use N2\A
를 했을 경우, N2\A::foo
가 출력 된다.
namespace
{
$a = new N1\A();
$a->foo();
}
- 위 처럼
use
를 쓰는대신 class에 namespace를 붙여서 사용해도 된다.
- 그리고 Namespace 이름에
\
를 이어붙여서 Hierarchical 하게 나타내는 방식을 많이 쓴다.
Exercise 2 : global namespace
namespace N
{
function var_dump($a) {
echo __NAMESPACE__ . "\n";
}
var_dump('aa');
\var_dump('aa');
}
- 위 코드는 해당 namespace안에서 var_dump라는 함수를 정의하였을 때,
- 명시적으로 global namespace의 var_dump 함수를 부르기 위해서는
\var_dump()
와 같이 써야 함을 보여준다.
Exercise 3 : 충돌 (같은 이름의 class를 use 할 때)
as
키워드를 사용하여 use로 불러오는 class의 이름을 바꿔준다. (별칭 붙이기.)
<?
namespace N1
{
class A
{
public function foo() {
echo __METHOD__ . "\n";
}
}
}
namespace N2
{
class A
{
public function foo() {
echo __METHOD__ . "\n";
}
}
}
namespace
{
use N1\A as A1;
use N2\A as A2;
}
Excercise 4 : 함수, 상수 가져오기
- 앞선 예시까지는
use
를 이용해서 namespace안의 class만 가져왔다.
- 각 각
use function
, use const
를 이용하면 함수와 상수를 가져오는 것도 가능하다.
- 근데
가져온다
는 워딩이 안 맞는 것 같다. 가져오는건 include()
에서 가져오는거고, use
키워드로는 가져와져 있는 class(혹은 function, const) 의 namespace를 제거해주는 역할을 한다.
namespace N1
{
class A
{
}
const MESSAGE = "HI";
function foo() {
return 'FOO';
}
}
namespace {
use N1\A;
use const N1\MESSAGE;
use function N1\foo;
echo MESSAGE;
echo " ";
echo foo();
}