Пространства имен и динамические особенности языка


(PHP 5 >= 5.3.0)

На реализацию пространств имен в PHP повлияли и динамические особенности языка. Преобразуем нижеследующий код для использования пространств имен:

Пример #1 Динамически доступные элементы

example1.php:

<?php
class classname
{
    function 
__construct()
    {
        echo 
__METHOD__,"\n";
    }
}
function 
funcname()
{
    echo 
__FUNCTION__,"\n";
}
const 
constname "global";

$a 'classname';
$obj = new $a// выводит classname::__construct
$b 'funcname';
$b(); // выводит funcname
echo constant('constname'), "\n"// выводит global
?>
Необходимо использовать абсолютное имя (имя класса с префиксом пространства имен). Обратите внимание, что нет никакой разницы между полным именем и абсолютным внутри динамического имени класса, функции или константы. Начальный обратный слэш не является необходимым.

Пример #2 Динамически доступные элементы пространства имен

<?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// выводит classname::__construct
$b 'funcname';
$b(); // выводит funcname
echo constant('constname'), "\n"// выводит global

/* обратите внимание, что при использовании двойных кавычек символ обратного слэша должен быть заэкранирован. Например, "\\namespacename\\classname" */
$a '\namespacename\classname';
$obj = new $a// выводит namespacename\classname::__construct
$a 'namespacename\classname';
$obj = new $a// также выводит namespacename\classname::__construct
$b 'namespacename\funcname';
$b(); // выводит namespacename\funcname
$b '\namespacename\funcname';
$b(); // также выводит namespacename\funcname
echo constant('\namespacename\constname'), "\n"// выводит namespaced
echo constant('namespacename\constname'), "\n"// также выводит namespaced
?>

Обязательно прочитайте примечание об экранировании имен пространства имен в строках.