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

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

네임스페이스 사용에 대해 논의하기 전에 PHP가 코드가 요청하는 네임스페이스 요소를 어떻게 인식하는지 이해하는 것이 중요합니다. PHP 네임스페이스와 파일 시스템 간에 간단한 비유를 할 수 있습니다. 파일 시스템의 파일에 액세스하는 방법에는 세 가지가 있습니다.

  1. foo.txt와 같은 상대 파일 이름. 이것은 현재 디렉토리가 현재 점유된 디렉토리인 currentdirectory/foo.txt로 확인됩니다. 따라서 현재 디렉토리가 /home/foo이면 이름은 /home/foo/foo.txt로 해석됩니다.
  2. subdirectory/foo.txt와 같은 상대 경로 이름. 이것은 currentdirectory/subdirectory/foo.txt로 확인됩니다.
  3. /main/foo.txt와 같은 절대 경로 이름. 이것은 /main/foo.txt로 확인됩니다.

PHP의 네임스페이스 요소에도 동일한 원칙을 적용할 수 있습니다. 예를 들어, 클래스 이름은 세 가지 방법으로 참조할 수 있습니다.

  1. 정규화되지 않은 이름 또는 $a = new foo();와 같은 접두사가 없는 클래스 이름 또는 foo::staticmethod();. 현재 네임스페이스가 currentnamespace이면 currentnamespace\foo로 확인됩니다. 코드가 네임스페이스가 아닌 전역 코드인 경우 foo로 확인됩니다. 한 가지 주의 사항: 이름 공간이 지정된 함수 또는 상수가 정의되지 않은 경우 함수 및 상수의 규정되지 않은 이름은 전역 함수 및 상수로 해석됩니다. 자세한 내용은 네임스페이스 사용: 전역 함수/상수로 대체를 참조하세요.
  2. 정규화된 이름 또는 $a = new subnamespace\foo();와 같은 접두어가 붙은 클래스 이름 또는 subnamespace\foo::staticmethod();. 현재 네임스페이스가 currentnamespace이면 currentnamespace\subnamespace\foo로 확인됩니다. 코드가 네임스페이스가 없는 전역 코드인 경우 subnamespace\foo로 확인됩니다.
  3. 정규화된 이름 또는 $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 {}

$a = \strlen('hi'); // calls global function strlen
$b = \INI_ALL; // accesses global constant INI_ALL
$c = new \Exception('error'); // instantiates global class Exception
?>