以下不起作用:
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);
}
任何想法如何使用上面声明的命名空间而不是函数?
谢谢!
答案 0 :(得分:3)
来自constant()
上的php.net评论部分:
从PHP 5.4.6开始,constant()不关注可能在其使用的文件中定义的任何名称空间别名。即constant()总是表现得好像是从全局命名空间调用的。
您必须使用完整的命名空间路径。
答案 1 :(得分:2)
作为字符串传递的所有类名对当前名称空间和别名“免疫”,它们都是完全限定名称。无论您是通过变量实例化新类还是通过字符串名称解析常量,您始终需要使用FQN。它只是实用的:字符串可以从一个名称空间传递到另一个名称空间,不可能为它们创建明确的解决方案规则。
答案 2 :(得分:1)
您可以使用__NAMESPACE__
keyword。
Yii::app()->auditor->log(constant(__NAMESPACE__ . '\AuditLevel::'.$level), $message, $context);
当然这只会在同一个命名空间中起作用 - 否则你需要提供完整的路径[这对我来说听起来很合理]。