Php константа () не работает с пространством имен?
Следующее не работает:
use application\components\auditor\AuditLevel;
public function actionAudit()
{
$data=unserialize($_POST['data']);
$message=$data['message'];
$context=$data['context'];
$level=$context['level'];
Yii::app()->auditor->log(constant('AuditLevel::'.$level), $message, $context);
}
// constant(): Couldn't find constant AuditLevel::INFO
Но наличие всего пространства имен работает:
use application\components\auditor\AuditLevel;
public function actionAudit()
{
$data=unserialize($_POST['data']);
$message=$data['message'];
$context=$data['context'];
$level=$context['level'];
Yii::app()->auditor->log(constant('application\components\auditor\AuditLevel::'.$level), $message, $context);
}
Любая идея, как я могу использовать пространство имен, объявленное выше, а не в функции?
Спасибо!
3 ответа
Из раздела комментариев php.net constant()
:
Начиная с PHP 5.4.6 constant() не обращает внимания на псевдонимы пространства имен, которые могут быть определены в файле, в котором он используется. Т.е. constant() всегда ведет себя так, как будто он вызывается из глобального пространства имен.
Вы должны использовать полный путь к пространству имен.
Все имена классов, передаваемые в виде строки, "невосприимчивы" к текущему пространству имен и псевдонимам, они всегда являются полностью определенными именами. Независимо от того, создаете ли вы экземпляр нового класса по переменной или разрешаете константу по строковому имени, вам всегда нужно использовать FQN. Это только практично: строки могут передаваться из одного пространства имен в другое, для них невозможно создать четкие правила разрешения.
Вы можете использовать __NAMESPACE__
ключевое слово
Yii::app()->auditor->log(constant(__NAMESPACE__ . '\AuditLevel::'.$level), $message, $context);
Конечно, это будет работать только в одном и том же пространстве имен - в противном случае вам нужно указать полный путь [что мне кажется разумным].