Статьи

Как использовать пространства имен PHP, часть 1: основы

PHP 5.3 namespaces Пространства имен являются одним из наиболее значительных изменений в 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 разрешает имена пространств имен.

Смотрите также: