Пространства имен являются одним из наиболее значительных изменений в PHP 5.3. Они будут знакомы разработчикам на C # и Java и, вероятно, изменят структуру PHP-приложений в лучшую сторону.
Зачем нам нужны пространства имен?
Чем больше размер вашей библиотеки PHP-кода, тем больше вероятность, что вы случайно будете использовать имя функции или класса, которое было объявлено ранее. Проблема усугубляется, если вы пытаетесь добавить сторонние компоненты или плагины; Что если два или более кодовых набора реализуют класс «База данных»?
До сих пор единственным решением были длинные имена классов / функций. Например, WordPress префикс каждого имени с «WP_». Zend Framework использует строго описательное соглашение об именах, которое приводит к повторным именам классов, таких как Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive.
Проблемы столкновения имен могут быть решены с помощью пространств имен. Константы, классы и функции PHP могут быть сгруппированы в библиотеки пространств имен.
Как определяются пространства имен?
По умолчанию все имена констант, классов и функций размещаются в глобальном пространстве, как это было до поддержки пространств имен.
Код пространства имен определяется с помощью одного ключевого слова namespace
Это должна быть первая команда (за исключением declare
<?php
// define this code in the MyProject namespace
namespace MyProject;
Код, следующий за этой строкой, будет принадлежать пространству имен MyProject. Невозможно вложить пространства имен или определить два или более пространств имен для одного и того же блока кода (распознается только последнее). Тем не менее, вы можете определить другой код пространства имен в том же файле, например
<?php
namespace MyProject1;
// PHP code for the MyProject1 namespace
namespace MyProject2;
// PHP code for the MyProject2 namespace
// Alternative syntax
namespace MyProject3 {
// PHP code for the MyProject3 namespace
}
?>
Тем не менее, я бы настоятельно рекомендовал определить одно пространство имен для файла.
Суб-пространства имена
PHP позволяет вам определять иерархию имен пространства имен, чтобы библиотеки могли быть разделены. Под-пространства имен разделяются с помощью символа обратной косой черты (\), например
- MyProject \ подимени
- MyProject \ Database \ MySQL
- НазваниеКомпании \ MyProject \ Common \ Widget
Вызов кода пространства имен
В файле с именем lib1.php мы определим константу, функцию и класс с пространством имен App \ Lib1:
lib1.php
<?php
// application library 1
namespace App\Lib1;
const MYCONST = 'App\Lib1\MYCONST';
function MyFunction() {
return __FUNCTION__;
}
class MyClass {
static function WhoAmI() {
return __METHOD__;
}
}
?>
Чтобы вызвать этот код, мы можем использовать код PHP, такой как:
myapp.php
<?php
header('Content-type: text/plain');
require_once('lib1.php');
echo \App\Lib1\MYCONST . "\n";
echo \App\Lib1\MyFunction() . "\n";
echo \App\Lib1\MyClass::WhoAmI() . "\n";
?>
Для myapp.php пространство имен не определено, поэтому код существует в глобальном пространстве. Любая прямая ссылка на MYCONST, MyFunction () или MyClass потерпит неудачу, поскольку они существуют в пространстве имен App \ Lib1. Поэтому мы должны добавить префикс \ App \ Lib1, чтобы создать полное имя. Следующий результат выводится, когда мы загружаем myapp.php:
App\Lib1\MYCONST
App\Lib1\MyFunction
App\Lib1\MyClass::WhoAmI
Полностью квалифицированные имена, очевидно, могут стать довольно длинными, и у определения имени класса App-Lib1-MyClass мало преимуществ. Однако в следующей статье мы обсудим псевдонимы и рассмотрим, как PHP разрешает имена пространств имен.
Смотрите также: