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


У меня возникли некоторые проблемы с использованием констант из пространства имен. Если я определю константу и попытаюсь использовать ее в качестве нее, 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'));

Я получаю ожидаемый результат, но это, очевидно, немного менее удобно, чем просто возможность напрямую вводить константы.

Вы можете создать псевдоним класса/интерфейса/признака в пространстве имен, не можете ли вы также создать псевдоним константы? Если вы можете это сделать, то как?

Author: GordonM, 2013-11-02

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; 
 4
Author: sectus, 2013-11-02 09:51:15

Поддержка импорта функций и констант из пространств имен была добавлена в 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
 3
Author: , 2016-03-25 23:59:49