네임스페이스 사용하기: 기본

네임스페이스 사용하기: 기본 (Using namespaces: Basics)

PHP가 요청한 네임스페이스 요소를 어떻게 해석하는지, 그 이름 해석(name resolution) 규칙의 기초를 다룬다. 비정규(Unqualified)·정규(Qualified)·완전 정규(Fully qualified) 이름의 차이를 파일시스템 비유로 쉽게 설명한다.

출처: Using namespaces: Basics

본문

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

네임스페이스의 사용을 논하기 전에, PHP가 여러분의 코드가 요청하는 네임스페이스 요소가 무엇인지 어떻게 알게 되는지 이해하는 것이 중요합니다. PHP 네임스페이스와 파일시스템 사이에는 간단한 비유가 성립합니다. 파일시스템에서 파일에 접근하는 방식은 세 가지가 있습니다.

  • 상대 파일 이름(Relative file name)foo.txt 같은 경우입니다. 이것은 currentdirectory/foo.txt 로 해석되며, 여기서 currentdirectory 는 현재 점유 중인 디렉터리입니다. 그래서 현재 디렉터리가 /home/foo 라면, 그 이름은 /home/foo/foo.txt 로 해석됩니다.
  • 상대 경로 이름(Relative path name)subdirectory/foo.txt 같은 경우입니다. 이것은 currentdirectory/subdirectory/foo.txt 로 해석됩니다.
  • 절대 경로 이름(Absolute path name)/main/foo.txt 같은 경우입니다. 이것은 /main/foo.txt 로 해석됩니다.

같은 원리가 PHP의 네임스페이스 요소에도 적용될 수 있습니다. 예를 들어, 클래스 이름은 세 가지 방식으로 참조될 수 있습니다.

1. 비정규 이름(Unqualified name), 또는 접두사 없는 클래스 이름 — $a = new foo(); 또는 foo::staticmethod(); 같은 것입니다. 현재 네임스페이스가 currentnamespace 라면, 이것은 currentnamespace\foo 로 해석됩니다. 코드가 전역이고 네임스페이스가 없는 코드라면, 이것은 foo 로 해석됩니다.

한 가지 주의 사항: 함수와 상수의 비정규 이름은, 네임스페이스가 적용된 함수나 상수가 정의되어 있지 않다면 전역 함수와 상수로 해석됩니다. 자세한 내용은 "Using namespaces: fallback to global function/constant" 섹션을 참고하세요.

2. 정규 이름(Qualified name), 또는 접두사가 붙은 클래스 이름 — $a = new subnamespace\foo(); 또는 subnamespace\foo::staticmethod(); 같은 것입니다. 현재 네임스페이스가 currentnamespace 라면, 이것은 currentnamespace\subnamespace\foo 로 해석됩니다. 코드가 전역이고 네임스페이스가 없는 코드라면, 이것은 subnamespace\foo 로 해석됩니다.

3. 완전 정규 이름(Fully qualified name), 또는 전역 접두사 연산자(global prefix operator)가 붙은 이름 — $a = new \currentnamespace\foo(); 또는 \currentnamespace\foo::staticmethod(); 같은 것입니다. 이것은 항상 코드에 지정된 리터럴 이름, 즉 currentnamespace\foo 로 해석됩니다.

다음은 실제 코드에서 이 세 가지 문법을 보여 주는 예제입니다.

file1.php

<?php
namespace Foo\Bar\subnamespace;

const FOO = 1;
function foo() {}
class foo
{
    static function staticmethod() {}
}

file2.php

<?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

모든 전역 클래스, 함수 또는 상수에 접근하려면 완전 정규 이름을 사용할 수 있다는 점을 주목하세요. 예를 들어 \strlen() 또는 \Exception 또는 \INI_ALL 같은 경우입니다.

예제 #1 네임스페이스 안에서 전역 클래스·함수·상수에 접근하기

<?php
namespace Foo;

function strlen() {}
const INI_ALL = 3;
class Exception {}

print \strlen('hi') . "\n"; // calls global function strlen
print \INI_ALL . "\n"; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
print $c::class . "\n";

더 알아보기

  • 네임스페이스 이름 해석 규칙 (Name resolution rules)
  • 네임스페이스와 동적 언어 기능 (Namespaces and dynamic language features)
  • 전역 함수·상수로의 폴백 (Fallback to global function/constant)