php 常量()不适用于命名空间?

Posted

技术标签:

【中文标题】php 常量()不适用于命名空间?【英文标题】:Php constant() not working with namespace? 【发布时间】:2014-01-24 00:43:38 【问题描述】:

以下不起作用:

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

您可以使用__NAMESPACE__ keyword。

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

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

【讨论】:

以上是关于php 常量()不适用于命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

php命名空间使用总结

命名空间

为啥`XmlDocument.LoadXml()`不适用于命名空间?

命名空间

关于命名空间namespace

PHP中命名空间是怎样的存在?