PHP пространства имен (имен)
PHP пространства имен (имен) добавляется в PHP 5.3, если вы узнали, C # и Java, пространство имен, что нет ничего нового. Но в PHP, который до сих пор имеет очень важное значение.
PHP Пространства имен может решить следующие две задачи:
- Пользователь написанный код внутри PHP классов / функций / констант или конфликтов сторонних классов / функций / Константы имен между ними.
- В длинных имен идентификаторов (как правило, для облегчения первой категории, определенной) создать псевдоним (или короткий) имя улучшения читаемости исходного кода.
Определение пространств имен
По умолчанию, все константы, классы и имена функций помещаются в глобальном пространстве, точно так же, как и до поддержки пространства имен PHP.
Пространство имен декларации по ключевому слову пространства имен. Если имя файла содержит пробелы, то он должен объявить пространство имен перед любым другим кодом. Синтаксис выглядит следующим образом;
< ?php // 定义代码在 'MyProject' 命名空间中 namespace MyProject; // ... 代码 ...
Вы также можете определить различные пространства имен в том же файле в коде, такие как:
< ?php namespace MyProject1; // MyProject1 命名空间中的PHP代码 namespace MyProject2; // MyProject2 命名空间中的PHP代码 // 另一种语法 namespace MyProject3 { // MyProject3 命名空间中的PHP代码 } ?>
Прежде чем объявить пространство имен уникальный юридический код используется для определения исходного файла методы кодирования объявить заявление. Все не-PHP-код включает в себя пробелы не могут появляться до объявления пространства имен.
<?php declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码 namespace MyProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace { // 全局代码 session_start(); $a = MyProject\connect(); echo MyProject\Connection::start(); } ?>
Следующая ошибка синтаксиса кода будет происходить:
<html> <?php namespace MyProject; // 命名空间前出现了“<html>” 会致命错误 - 命名空间必须是程序脚本的第一条语句 ?>
Subnamespaces
Связь с каталогами и файлами так же, как, PHP Пространства имен также позволяет указать имя иерархическое пространство имен. Таким образом, имя пространства имен может быть определено с помощью иерархически:
<?php namespace MyProject\Sub\Level; //声明分层次的单个命名空间 const CONNECT_OK = 1; class Connection { /* ... */ } function Connect() { /* ... */ } ?>
Приведенный выше пример создает постоянную MyProject \ \ Sub Level \ CONNECT_OK, тип MyProject \ Sub \ Level \ Подключение и функция MyProject \ Sub \ Level \ Connect.
Пространства имен
PHP имя класса пространства имен можно ссылаться тремя способами:
Неквалифицированное имя, или имя класса не содержит префикс, например, $ а = новый Foo () или Foo :: STATICMETHOD ();. Если текущее пространство имен currentnamespace, Foo будет интерпретироваться как currentnamespace \ Foo. Если Foo является глобальный код, код не содержит каких-либо имен, оно будет разобрано как Foo Foo. Внимание: Если функция имен или константа не определена, то имя функции или неквалифицированное имя константы будут решены к глобальному имени функции или постоянное имя.
Квалифицированное имя, или имя содержит префикс, например, $ а = новый подпространстве имен \ Foo ( ), или подпространстве имен \ Foo :: STATICMETHOD ();. Если текущее пространство имен currentnamespace, то Foo будет разобрано как currentnamespace \ подпространстве имен \ Foo. Если Foo является глобальный код, код не содержит каких-либо имен, Foo будет разрешен к подпространстве имен \ Foo.
Полное имя, или включать в себя глобальное имя оператора префикс, например, $ а = новый \ currentnamespace \ Foo (); или \ currentnamespace \ Foo :: STATICMETHOD () ;. В этом случае Foo всегда будет решена с именем кодовых слов (буквальное название) 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() {} } /* 非限定名称 */ foo(); // 解析为 Foo\Bar\foo resolves to function Foo\Bar\foo foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。resolves to class Foo\Bar\foo, method staticmethod echo FOO; // resolves to constant Foo\Bar\FOO /* 限定名称 */ subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo, // 以及类的方法 staticmethod echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO /* 完全限定名称 */ \Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo \Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO ?>
Обратите внимание, что для доступа к любому глобальному класса, функции или константы, вы можете использовать полное имя, например, \ StrLen () или \ Exception или \ INI_ALL.
Пространство имен Доступ к глобальным классов, функций и констант:
<?php namespace Foo; function strlen() {} const INI_ALL = 3; class Exception {} $a = \strlen('hi'); // 调用全局函数strlen $b = \INI_ALL; // 访问全局常量 INI_ALL $c = new \Exception('error'); // 实例化全局类 Exception ?>
Пространства имен и динамические особенности языка
Реализация PHP имен пострадавших от собственных динамических особенностей языка. Итак, если вы хотите следующий код в пространствах имен, элементы динамического доступа.
example1.php код файла:
<?php class classname { function __construct() { echo __METHOD__,"\n"; } } function funcname() { echo __FUNCTION__,"\n"; } const constname = "global"; $a = 'classname'; $obj = new $a; // prints classname::__construct $b = 'funcname'; $b(); // prints funcname echo constant('constname'), "\n"; // prints global ?>
Вы должны использовать полное имя (включая имя класса префикса пространства имен). Обратите внимание, что, поскольку в имени динамического класса, имени функции или постоянное имя, уточненное имя и полное имя нет никакой разницы, поэтому ведущий обратный слеш не нужен.
Элемент пространства имен Dynamic Access
<?php namespace namespacename; class classname { function __construct() { echo __METHOD__,"\n"; } } function funcname() { echo __FUNCTION__,"\n"; } const constname = "namespaced"; include 'example1.php'; $a = 'classname'; $obj = new $a; // prints classname::__construct $b = 'funcname'; $b(); // prints funcname echo constant('constname'), "\n"; // prints global /* note that if using double quotes, "\\namespacename\\classname" must be used */ $a = '\namespacename\classname'; $obj = new $a; // prints namespacename\classname::__construct $a = 'namespacename\classname'; $obj = new $a; // also prints namespacename\classname::__construct $b = 'namespacename\funcname'; $b(); // prints namespacename\funcname $b = '\namespacename\funcname'; $b(); // also prints namespacename\funcname echo constant('\namespacename\constname'), "\n"; // prints namespaced echo constant('namespacename\constname'), "\n"; // also prints namespaced ?>
Пространство имен ключевых слов и константы __NAMESPACE__
PHP поддерживает два способа доступа текущего пространства имен абстрактных элементов интерьера, __ NAMESPACE__ Магические константы и пространства имен ключевое слово.
__NAMESPACE__ Постоянное значение является строкой, содержащей имя текущего пространства имен. В глобальном, код не включает в себя пространство имен, которое содержит пустую строку.
__NAMESPACE__ Например, в коде пространства имен
<?php namespace MyProject; echo '"', __NAMESPACE__, '"'; // 输出 "MyProject" ?>
__NAMESPACE__ Пример, глобальный код
<?php echo '"', __NAMESPACE__, '"'; // 输出 "" ?>
Константа __NAMESPACE__ создается динамически, когда имя полезно, например:
Используйте __NAMESPACE__ динамически создаваемых имя
<?php namespace MyProject; function get($classname) { $a = __NAMESPACE__ . '\\' . $classname; return new $a; } ?>
Пространство имен можно использовать ключевое слово явным образом получить доступ к текущему пространству имен или суб-пространств имен элементов. Это эквивалентно классу собственного оператора.
Пространство имен кода оператора пространства имен
<?php namespace MyProject; use blah\blah as mine; // see "Using namespaces: importing/aliasing" blah\mine(); // calls function blah\blah\mine() namespace\blah\mine(); // calls function MyProject\blah\mine() namespace\func(); // calls function MyProject\func() namespace\sub\func(); // calls function MyProject\sub\func() namespace\cname::method(); // calls static method "method" of class MyProject\cname $a = new namespace\sub\cname(); // instantiates object of class MyProject\sub\cname $b = namespace\CONSTANT; // assigns value of constant MyProject\CONSTANT to $b ?>
Оператор пространства имен, глобальный код
<?php namespace\func(); // calls function func() namespace\sub\func(); // calls function sub\func() namespace\cname::method(); // calls static method "method" of class cname $a = new namespace\sub\cname(); // instantiates object of class sub\cname $b = namespace\CONSTANT; // assigns value of constant CONSTANT to $b ?>
Использование пространств имен: Aliasing / Импорт
PHP Пространства имен поддерживают два используя псевдонимы или импорта: Используйте псевдоним для имени класса или псевдоним для имени пространства имен. Обратите внимание, что PHP не поддерживает импорт функции или константы.
В PHP, псевдоним для использования оператора для достижения следующих является использование всех возможных способов импортировать три примера:
1, используя использование оператора импорта / псевдоним
<?php namespace foo; use My\Full\Classname as Another; // 下面的例子与 use My\Full\NSname as NSname 相同 use My\Full\NSname; // 导入一个全局类 use \ArrayObject; $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 对象 ?>
2, строка, которая содержит несколько операторов использования
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化 My\Full\Classname 对象 NSname\subns\func(); // 调用函数 My\Full\NSname\subns\func ?>
Операция импорта выполняется во время компиляции, но имя динамический класс, имя функции, или имя константы нет.
3, Импорт и динамическое имя
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // 实例化一个 My\Full\Classname 对象 $a = 'Another'; $obj = new $a; // 实际化一个 Another 对象 ?>
Кроме того, операция импорта влияет только на неквалифицированные и квалифицированные имена. Полное имя, потому что он идентифицируется, оно не зависит от импорта.
4, импортирующих и полные имена
<?php use My\Full\Classname as Another, My\Full\NSname; $obj = new Another; // instantiates object of class My\Full\Classname $obj = new \Another; // instantiates object of class Another $obj = new Another\thing; // instantiates object of class My\Full\Classname\thing $obj = new \Another\thing; // instantiates object of class Another\thing ?>
Использование пространств имен: Откат к глобальной функции / константы
В пространстве имен, когда PHP встречает безоговорочную класс, функцию или постоянное имя, она использует различные приоритетные стратегии для разрешения имени. Имя класса текущего имени пространства имен всегда решает. Поэтому, во внутреннем доступа к системе или не входит в пространстве имен имя класса, вы должны использовать полное имя, например:
1, доступ к глобальным классам в пространстве имен
<?php namespace A\B\C; class Exception extends \Exception {} $a = new Exception('hi'); // $a 是类 A\B\C\Exception 的一个对象 $b = new \Exception('hi'); // $b 是类 Exception 的一个对象 $c = new ArrayObject; // 致命错误, 找不到 A\B\C\ArrayObject 类 ?>
Для функций и констант, функция не существует или, если текущие константы пространства имен, PHP будет вернуться к глобальным функциям или констант в пространстве.
2, функция глобального пространства имен зарезервировано / константы
<?php namespace A\B\C; const E_ERROR = 45; function strlen($str) { return \strlen($str) - 1; } echo E_ERROR, "\n"; // 输出 "45" echo INI_ALL, "\n"; // 输出 "7" - 使用全局常量 INI_ALL echo strlen('hi'), "\n"; // 输出 "1" if (is_array('hi')) { // 输出 "is not array" echo "is array\n"; } else { echo "is not array\n"; } ?>
Глобальное пространство
Если вы не определите пространство имен, все определения и функции класса находятся в глобальном пространстве и PHP как до введения концепции пространств имен. Перед именем префикс \ указывает на то, что имя является глобальное пространство имен, это также справедливо и для других имен, даже если имя находится.
Описание Использовать глобальное пространство
<?php namespace A\B\C; /* 这个函数是 A\B\C\fopen */ function fopen() { /* ... */ $f = \fopen(...); // 调用全局的fopen函数 return $f; } ?>
Пространство имен заказа
Так как с пространством имен, которая является наиболее подверженной ошибкам использование времени класса, чтобы найти путь этого класса является то, что.
<?php namespace A; use B\D, C\E as F; // 函数调用 foo(); // 首先尝试调用定义在命名空间"A"中的函数foo() // 再尝试调用全局函数 "foo" \foo(); // 调用全局空间函数 "foo" my\foo(); // 调用定义在命名空间"A\my"中函数 "foo" F(); // 首先尝试调用定义在命名空间"A"中的函数 "F" // 再尝试调用全局函数 "F" // 类引用 new B(); // 创建命名空间 "A" 中定义的类 "B" 的一个对象 // 如果未找到,则尝试自动装载类 "A\B" new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象 // 如果未找到,则尝试自动装载类 "B\D" new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象 // 如果未找到,则尝试自动装载类 "C\E" new \B(); // 创建定义在全局空间中的类 "B" 的一个对象 // 如果未发现,则尝试自动装载类 "B" new \D(); // 创建定义在全局空间中的类 "D" 的一个对象 // 如果未发现,则尝试自动装载类 "D" new \F(); // 创建定义在全局空间中的类 "F" 的一个对象 // 如果未发现,则尝试自动装载类 "F" // 调用另一个命名空间中的静态方法或命名空间函数 B\foo(); // 调用命名空间 "A\B" 中函数 "foo" B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法 // 如果未找到类 "A\B" ,则尝试自动装载类 "A\B" D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法 // 如果类 "B\D" 未找到,则尝试自动装载类 "B\D" \B\foo(); // 调用命名空间 "B" 中的函数 "foo" \B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法 // 如果类 "B" 未找到,则尝试自动装载类 "B" // 当前命名空间中的静态方法或函数 A\B::foo(); // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B" \A\B::foo(); // 调用命名空间 "A\B" 中定义的类 "B" 的 "foo" 方法 // 如果类 "A\B" 未找到,则尝试自动装载类 "A\B" ?>
Name Resolution следующие правила:
- Функция полное имя класса и постоянные звонки во время компиляции. Например новый \ A \ B решает класса A \ B.
- Все неквалифицированные и квалифицированные имена (не полностью квалифицированные имена) преобразуются во время компиляции на основе текущих правил импорта. Например, если пространство имен A \ B \ C импортируется как C, то вызов C \ D \ е () будут преобразованы в A \ B \ C \ D \ е ().
- Пространство имен внутри, все квалифицированные имена не переводятся в соответствии с правилами импорта будут добавлены к текущему имени пространства имен перед ним. Например, в пространстве имен A \ B Внутренний вызов C \ D \ е (), то C \ D \ е () транслируется в A \ B \ C \ D \ е ().
- Номера имя класса преобразователя (с полным именем вместо имени краткого введения) во время компиляции на основе текущих правил импорта. Например, если пространство имен A \ B \ C импортируется как C, новый C () преобразуются в новый A \ B \ C () .
- Пространство имен внутренней (например, A \ B), вызов неквалифицированных имя функции будет решена во время выполнения. Например, вызов функции Foo () решается следующим образом :
- Найти называется A \ B \ Foo в текущем пространстве имен () функция
- Постарайтесь найти и вызвать глобальную (глобальное) пространство функции Foo ().
- Пространство имен (например, A \ B) внутренней по отношению к неквалифицированным или квалифицированное имя имен классов (не полностью квалифицированные имена) вызов разрешен во время выполнения. Вот призыв к новым C () и новый D \ E () процесса урегулирования: новый C () синтаксический анализ:
- Найти A \ B класс \ C в текущем пространстве имен.
- Он пытается автозагрузку A \ B \ C.
- В имени класса предшествует текущее имя пространства имен становится: A \ B \ D \ E , а затем посмотреть на класс.
- Он пытается автозагрузку A \ B \ D \ E.