네임스페이스 사용: 함수와 상수의 전역 공간 폴백(Global Space Fallback)
네임스페이스 사용: 함수와 상수의 전역 공간 폴백(Global Space Fallback)
네임스페이스 안에서 PHP가 클래스 이름, 함수, 상수 문맥에서 **비정규화된 이름(Name)**을 만나게 되면, 각각 다른 우선순위로 이름을 해석해요. 이 차이를 미리 알아두면 어떤 경우에 전역(global)으로 빠지는지 헷갈리지 않을 수 있어요.
우선 클래스 이름은 항상 현재 네임스페이스 이름으로 해석돼요. 그래서 내장 클래스나 네임스페이스가 없는 사용자 클래스에 접근하려면, 아래처럼 **정규화된 이름(fully qualified Name)**으로 직접 지정해야 해요.
예제 #1 — 네임스페이스 안에서 전역 클래스에 접근하기
<?php
namespace A\B\C;
class Exception extends \Exception {}
$a = new Exception('hi'); // $a is an object of class A\B\C\Exception
var_dump($a::class);
$b = new \Exception('hi'); // $b is an object of class Exception
var_dump($b::class);
$c = new ArrayObject; // fatal error, class A\B\C\ArrayObject not found
여기서 Exception은 현재 네임스페이스(A\B\C) 안에서 해석되지만, \Exception처럼 앞에 백슬래시를 붙이면 전역 클래스를 가리키는 거죠. 반대로 ArrayObject를 그냥 쓰면 A\B\C\ArrayObject를 찾으려다 없어서 fatal error가 나요. 클래스는 전역으로 폴백하지 않는 게 핵심이에요.
반면 함수와 상수는 조금 달라요. 네임스페이스 안에 해당하는 함수나 상수가 없으면, PHP가 알아서 전역 함수나 상수로 폴백해 줘요.
예제 #2 — 네임스페이스 안에서 전역 함수/상수 폴백
<?php
namespace A\B\C;
const E_ERROR = 45;
function strlen($str)
{
return \strlen($str) - 1;
}
echo E_ERROR, "\n"; // prints "45"
echo INI_ALL, "\n"; // prints "7" - falls back to global INI_ALL
echo strlen('hi'), "\n"; // prints "1"
if (is_array('hi')) { // prints "is not array"
echo "is array\n";
} else {
echo "is not array\n";
}
여기서 E_ERROR는 네임스페이스 안에 직접 정의되어 있으니 45가 출력되고, INI_ALL은 네임스페이스 안에 없으니 전역 상수로 폴백해서 7이 나와요. strlen()도 네임스페이스 안에 정의된 함수가 호출되고, is_array()처럼 정의되어 있지 않은 함수는 전역 함수로 폴백되는 걸 볼 수 있어요.
즉 정리하면, 클래스는 폴백 없이 현재 네임스페이스 기준으로만 해석되고, 함수와 상수는 없으면 전역으로 폴백된다는 규칙을 기억하면 돼요.