TL;DR
PHP의 Namespace의 범위는 include, require의 상관없이 해당 파일에서만 영향을 끼친다.
Namespace
PHP 5.3부터 추가된 같은 이름의 함수, 클래스가 있을 때 네임스페이스로 각각 격리하여 사용할 수 있게 해주는 기능이다.
Simple example
spaceA.php
<?php
namespace A;
echo __FILE__ . ' > ' . __NAMESPACE__ . PHP_EOL;
function atest() { echo "spaceA atest function\n"; }
spaceB.php
<?php
echo __FILE__ . ' > ' . __NAMESPACE__ . PHP_EOL;
function btest() { echo "spaceB btest function\n"; }
index.php
<?php
namespace INDEX;
require('spaceA.php');
require('spaceB.php');
echo __FILE__ . ' > ' . __NAMESPACE__ . PHP_EOL;
btest();
atest();
php index.php
로 php를 실행시키면 결과는 다음과 같다.
/home/silnex/test/spaceA.php > A
/home/silnex/test/spaceB.php >
/home/silnex/test/index.php > INDEX
spaceB btest function
PHP Fatal error: Uncaught Error: Call to undefined function INDEX\atest() in /home/silnex/test/index.php:11
Stack trace:
#0 {main}
thrown in /home/silnex/test/index.php on line 11
require('spaceA.php')
의 결과가 출력된 1번째 줄을 보면
네임스페이스는 index.php에서 선언된 INDEX
가 아닌 spaceA.php
파일에서 선언된 네임 스페이스다.
require('spaceB.php')
의 결과가 출력된 2번째 줄을 보면
네임스페이스는 INDEX도 A도 아닌 아무 선언 안된 것을 볼 수 있다.
즉, 네임스페이스는 다른파일엔 영향을 끼치지 않는다는 걸 알 수 있다.
btest()
의 실행 결과인 4번째 줄을 보면,
정상적으로 실행되고 있으나,atest()
의 경우 5번째줄 부터 표시된 에러가 나는것을 볼 수 있다.
이를 통해 함수가 받는 영향을 알 수 있는데,
기본적으로 Namespace가 없는 함수를 먼저 호출 하고, 만약 함수가 없다면,
현재 파일의 Namespace의 함수를 찾는 것을 확인 할 수 있다.