Pull to refresh

Как использовать пространства имён в PHP, Часть 3: Ключевые слова и автозагрузка

PHP *
Translation
Original author: Craig Buckler
image
В части 1 и 2 нашей серии статей мы рассмотрели основы пространства имён, а также импортирование, псевдонимы и правила разбора имён. В данной, заключительной, статье мы обговорим некоторые более продвинутые опции пространства имён.

Константа __NAMESPACE__


__NAMESPACE__ это строка PHP, которая всегда возвращает текущее имя пространства имён. В глобальном пространстве она будет всегда пустой строкой.
<?php
namespace App\Lib1;
echo __NAMESPACE__; // outputs: App\Lib1
?>

Её значение имеет очевидную выгоду во время отладки. Её также можно использовать чтобы динамически генерировать полные квалифицированные имена классов, например:
<?php
namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}

$c = __NAMESPACE__ . '\\MyClass';
$m = new $c;
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
?>

Ключевое слово namespace


Ключевое слово namespace может использоваться для того чтобы явно указать источник позиции (дать на него ссылку) в пределах текущего пространства имён или подпространства имён. Эквивалент namespace — ключевое слово self для классов:
<?php
namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}

$m = new namespace\MyClass;
echo $m->WhoAmI(); // outputs: App\Lib1\MyClass::WhoAmI
?>

Автозагрузка классов пространств имен


Одна из наилучших возможностей экономящих время в PHP 5 это автозагрузка. В глобальном (не отнесенном к какому-либо пространству имен) PHP коде, стандартная функция автозагрузки может быть записана следующим образом:
<?php
$obj1 = new MyClass1(); // classes/MyClass1.php is auto-loaded
$obj2 = new MyClass2(); // classes/MyClass2.php is auto-loaded

// autoload function
function __autoload($class_name) {
	require_once("classes/$class_name.php");
}
?>

В PHP 5.3 Вы можете создать экземпляр класса пространства имен. В этой ситуации, полные квалифицированные имена пространств имён и имена классов передаются функции __autoload, например, значением $class_name может быть "App\Lib1\MyClass". Вы можете продолжить размещать Ваши файлы PHP классов в одной и той же папке и отбирать пространства имён из строки, однако, это может привести к конфликту файловых имен.

В качестве альтернативы, файловая иерархия Ваших классов может быть организована таким же образом как и структура Ваших пространств имен. Например, файл MyClass.php может быть создан в папке /classes/App/Lib1:

/classes/App/Lib1/MyClass.php:

<?php
namespace App\Lib1;

class MyClass {
	public function WhoAmI() {
		return __METHOD__;
	}
}
?>

Файл, находящийся в корневой директории может его использовать с помощью следующего кода:

myapp.php:

<?php
use App\Lib1\MyClass as MC;

$obj = new MC();
echo $obj->WhoAmI();

// autoload function
function __autoload($class) {

	// convert namespace to full file path
	$class = 'classes\' . str_replace('\\', '/', $class) . '.php';
	require_once($class);

}
?>

Пояснение:

  1. Используем псевдоним MC для класса App\Lib1\MyClass
  2. Во время компиляции new MC() транслируется в new App\Lib1\MyClass().
  3. Строка "App\Lib1\MyClass" передается функции __autoload. Это заменяет все обратные слэши пространств имён на прямые слэши пути файла, и видоизменяет строку таким образом, что загружается файл "classes\App\Lib1\MyClass.php".


Я надеюсь что Вам пригодится эта серия статей о пространствах имён PHP. Будете ли Вы использовать пространства имён в своем PHP коде?

Читайте также:


Как использовать пространства имен в PHP, Часть 1: Основы
Как использовать пространства имён в PHP, Часть 2: Импортирование, псевдонимы и правила разбора имён

Примечания:


A/ Во время работы над переводом, когда искал очередной термин, нашел здесь эту же третью часть, но уже переведенную. На мой взгляд, в том переводе содержатся достаточно грубые ошибки, сравните:
Ключевое словов namespace может быть использован для четкой связи между текущим пространством имени и подпространствами на подобии self в классах

Мой перевод:
Ключевое слово namespace может использоваться для того чтобы явно указать источник позиции (дать на него ссылку) в пределах текущего пространства имён или подпространства имён. Эквивалент namespace — ключевое слово self для классов


B/ Замечания, поправки, указания на неточности и проч. — приветствуются!
Tags:
Hubs:
Total votes 63: ↑52 and ↓11 +41
Views 20K
Comments Comments 10