Php constant()不使用命名空间?

时间:2014-01-06 15:08:13

标签: php namespaces class-constants

以下不起作用:

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 个答案:

答案 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);

当然这只会在同一个命名空间中起作用 - 否则你需要提供完整的路径[这对我来说听起来很合理]。