1

以下不起作用:

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);
}

知道如何使用上面声明的命名空间而不是在函数中使用吗?

谢谢!

4

3 回答 3

3

来自 php.net 的评论部分constant()

从 PHP 5.4.6 开始,constant() 不再关注可能在使用它的文件中定义的任何名称空间别名。即 constant() 总是表现得好像它是从全局命名空间调用的一样。

您必须使用完整的命名空间路径。

于 2014-01-06T15:11:57.747 回答
2

作为字符串传递的所有类名对当前命名空间和别名都是“免疫”的,它们都是完全限定的名称,总是。无论您是通过变量实例化新类还是通过字符串名称解析常量,您始终需要使用 FQN。它只是实用的:字符串可以从一个命名空间传递到另一个命名空间,不可能为它们创建明确的解析规则。

于 2014-01-06T15:15:31.827 回答
1

您可以使用__NAMESPACE__关键字.

Yii::app()->auditor->log(constant(__NAMESPACE__ . '\AuditLevel::'.$level), $message, $context);

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

于 2014-01-06T15:12:03.853 回答