Ключевое слово namespace и константа __NAMESPACE__
(PHP 5 >= 5.3.0, PHP 7)
PHP поддерживает два способа к абстрактно доступным элементам в текущем пространстве имен
таким, как магическая константа __NAMESPACE__
и
ключевое слово namespace.
Значение константы __NAMESPACE__
- это строка, которая содержит
имя текущего пространства имен. В глобальном пространстве, вне пространства имен, она
содержит пустую строку.
Пример #1 Пример использование константы __NAMESPACE__ в коде с пространством имен
<?php
namespace MyProject;
echo '"', __NAMESPACE__, '"'; // выводит "MyProject"
?>
Пример #2 Пример использование константы __NAMESPACE__ в глобальном пространстве
<?php
echo '"', __NAMESPACE__, '"'; // выводит ""
?>
__NAMESPACE__
полезна для динамически конструируемых
имен, например:
Пример #3 использование константы __NAMESPACE__ для динамического конструирования имени
<?php
namespace MyProject;
function get($classname)
{
$a = __NAMESPACE__ . '\\' . $classname;
return new $a;
}
?>
Ключевое слово namespace может быть использовано для явного запроса элемента из текущего пространства имен или из подпространства. Это эквивалент оператора self для классов в пространстве имен.
Пример #4 Оператор namespace, внутри пространства имен
<?php
namespace MyProject;
use blah\blah as mine; // см. "Использование пространств имен: импорт/создание псевдонима имени"
blah\mine(); // вызывает функцию MyProject\blah\mine()
namespace\blah\mine(); // вызывает функцию MyProject\blah\mine()
namespace\func(); // вызывает функцию MyProject\func()
namespace\sub\func(); // вызывает функцию MyProject\sub\func()
namespace\cname::method(); // вызывает статический метод "method" класса MyProject\cname
$a = new namespace\sub\cname(); // Создает экземпляр класса MyProject\sub\cname
$b = namespace\CONSTANT; // присваивает значение константы MyProject\CONSTANT переменной $b
?>
Пример #5 Оператор namespace в глобальном коде
<?php
namespace\func(); // вызывает функцию func()
namespace\sub\func(); // вызывает функцию sub\func()
namespace\cname::method(); // вызывает статический метод "method" класса cname
$a = new namespace\sub\cname(); // Создает экземпляр класса sub\cname
$b = namespace\CONSTANT; // присваивает значение константы CONSTANT переменной $b
?>
- Обзор пространств имен
- Определение пространств имен
- Определение подпространств имен
- Описание нескольких пространств имен в одном файле
- Использование пространства имен: основы
- Пространства имен и динамические особенности языка
- Ключевое слово namespace и константа __NAMESPACE__
- Использование пространств имен: импорт/создание псевдонима имени
- Глобальное пространство
- Использование пространств имен: переход к глобальной функции/константе
- Правила разрешения имен
- Часто задаваемые вопросы (FAQ): вещи, которые вам необходимо знать о пространствах имен
Коментарии
Just in case you wonder what the practical use of the namespace keyword is...
It can explicitly refer to classes from the current namespace regardless of possibly "use"d classes with the same name from other namespaces. However, this does not apply for functions.
Example:
<?php
namespace foo;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
class Xyz {}
function abc () {}
?>
<?php
namespace bar;
use foo\Xyz;
use foo\abc;
new Xyz(); // instantiates \foo\Xyz
new namespace\Xyz(); // instantiates \bar\Xyz
abc(); // invokes \bar\abc regardless of the second use statement
\foo\abc(); // it has to be invoked using the fully qualified name
?>
Hope, this can save someone from some trouble.
Best regards.
Difference between __NAMESPACE__ and keyword 'namespace' that I find relevant is when invoking a class:
<?php
namespace MyApp;
class App {
static function app(){
echo 'hello app';
}
}
// this will work:
$obj = new namespace\App::app();
// this will not work
$obj = new __NAMESPACE__\App::app();
// however this will work:
$obj = __NAMESPACE__ . '\App';
$obj::foo();
?>