Константы пространства имен и использовать в качестве
У меня возникли некоторые проблемы с использованием констант из пространства имен. Если я определю константу и попытаюсь использовать ее в качестве нее, PHP, похоже, не сможет ее найти. Например, в моем файле с константами у меня есть код примерно следующего содержания:
namespace \my\namespace\for\constants;
const DS = DIRECTORY_SEPARATOR;
Затем в файле потребления у меня есть:
namespace \some\other\namespace;
use \my\namespace\for\constants\DS as DS;
echo (realpath (DS . 'usr' . DS 'local'));
Однако вместо того, чтобы повторять "/usr/local", как ожидалось, я получаю следующее уведомление и пустую строку.
Примечание: Использование неопределенной константы DS - предполагается, что "DS"
Если я изменю код следующим образом:
use \my\namespace\for\constants as cns;
echo (realpath (cns\DS . 'usr' . cns\DS 'local'));
Я получаю ожидаемый результат, но это, очевидно, немного менее удобно, чем просто возможность напрямую вводить константы.
Вы можете создать псевдоним класса/интерфейса/признака в пространстве имен, не можете ли вы также создать псевдоним константы? Если вы можете это сделать, то как?
2 answers
Вам следует внимательно прочитать документацию.
Пространства имен PHP поддерживают три вида псевдонимов или импорта: псевдоним имени класса, псевдоним имени интерфейса и псевдоним имени пространства имен. Обратите внимание, что импорт функции или константы не поддерживается.
Http://php.net/manual/en/language.namespaces.importing.php
// trying to import constant -- not supported
use \my\namespace\for\constants\DS as DS;
// trying to import namespace -- it's works
use \my\namespace\for\constants as cns;
Поддержка импорта функций и констант из пространств имен была добавлена в PHP 5.6:
namespace my\space;
const CONSTANT_NAME = 123;
function function_name() {
echo "Test\n";
}
// elsewhere:
use function my\space\function_name;
function_name();
use function my\space\function_name as f;
f();
use const my\space\CONSTANT_NAME;
echo CONSTANT_NAME . "\n";
use const my\space\CONSTANT_NAME as C;
echo C . "\n";
Обратите внимание, что для того, чтобы быть импортируемыми, константы должны быть определены с помощью const
, а не define
:
namespace my\space;
const CONSTANT_NAME = 123; // this can be imported
define('CONSTANT_NAME', 123); // this sets a global constant
Следует отметить, что невозможно импортировать константы класса:
namespace my\space;
class Test {
const CONSTANT_NAME = 123;
}
use const my\space\Test\CONSTANT_NAME; // undefined constant
use const my\space\Test::CONSTANT_NAME; // syntax error