php.net
(PHP 5 >= 5.3.0, PHP 7)
네임스페이스 정의
적법한 PHP 코드는 모두 네임스페이스에 포함될 수 있지만, 클래스(추상 클래스 및 특성 포함), 인터페이스, 함수 및 상수와 같은 코드 유형은 네임스페이스의 영향을 받습니다.
파일에 네임스페이스가 포함된 경우 선언 키워드를 제외한 다른 모든 코드보다 먼저 네임스페이스를 선언해야 합니다. 공백을 포함하여 PHP가 아닌 모든 코드는 네임스페이스 선언 앞에 나타나서는 안 됩니다.
<html> <?phpnamespace MyProject; // 致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
동일한 네임스페이스를 여러 파일에 정의할 수 있어 동일한 네임스페이스의 내용을 나누어 다른 파일에 저장할 수 있습니다.
하위 네임스페이스 정의
<?php namespace MyProject\Sub\Level; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
동일한 파일에 여러 네임스페이스 정의
참고: 실제 프로그래밍 실습에서는 동일한 파일에 여러 네임스페이스를 정의하는 것을 권장하지 않습니다. 파일에 여러 개의 네임스페이스를 정의하세요!
<?php namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } }namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ } }?>
네임스페이스 사용
클래스 이름을 참조하는 세 가지 방법:
정규화되지 않은 이름(이름에 네임스페이스 구분 기호가 포함되지 않은 식별자) 또는 클래스 접두사 없는 이름. 예를 들어 $a=new foo(); 또는 foo::staticmethod();입니다. 현재 네임스페이스가 currentnamespace이면 foo는 currentnamespacefoo로 확인됩니다. foo를 사용하는 코드가 전역 코드이고 어떤 네임스페이스에도 코드를 포함하지 않는 경우 foo는 foo로 확인됩니다. * *경고**: 네임스페이스의 함수 또는 상수가 정의되지 않은 경우 정규화되지 않은 함수 또는 상수 이름은 전역 함수 또는 상수 이름으로 확인됩니다.
정식 이름(이름에 네임스페이스 구분 기호가 있는 식별자) 또는 $a = new subnamespacefoo() 또는 subnamespacefoo::staticmethod();와 같은 접두사가 포함된 이름. 현재 네임스페이스가 currentnamespace이면 foo는 currentnamespacesubnamespacefoo로 확인됩니다. foo를 사용하는 코드가 전역 코드인 경우, 어떤 네임스페이스에도 포함되지 않은 코드인 foo는 subnamespacefoo로 확인됩니다.
정규화된 이름(이름에 네임스페이스 구분 기호가 포함되고 네임스페이스 구분 기호로 시작하는 식별자) 또는 전역 접두사 연산자가 포함된 이름입니다. 전역 클래스, 함수 또는 상수에 액세스하려면 strlen() 또는 Exception 과 같은 정규화된 이름을 사용하세요.
팁:
$a = '\namespacename\classname'; $obj = new $a; $a = 'namespacename\classname'; $obj = new $a; $b = 'namespacename\funcname'; $b(); // prints namespacename\funcname$b = '\namespacename\funcname'; $b(); // also prints namespacename\funcname
관련 상수 사용
상수 __NAMESPACE__의 값은 현재 네임스페이스의 이름을 포함하는 문자열입니다. 네임스페이스에 포함되지 않은 전역 코드에는 빈 문자열이 포함됩니다.
네임스페이스 사용: aliases/imports
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use ArrayObject; // importing a function (PHP 5.6+) use function My\Full\functionName; // aliasing a function (PHP 5.6+) use function My\Full\functionName as func; // importing a constant (PHP 5.6+) use const My\Full\CONSTANT; $obj = new namespace\Another; // 实例化 foo\Another 对象 $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象 // 如果不使用 "use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象 func(); // calls function My\Full\functionName echo CONSTANT; // echoes the value of My\Full\CONSTANT ?>
클래스 이름은 항상 현재 네임스페이스의 이름으로 확인됩니다. 따라서 시스템 내부에 있거나 네임스페이스에 포함되지 않은 클래스 이름에 액세스할 때는 정규화된 이름을 사용해야 합니다.