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 常量()不适用于命名空间?的主要内容,如果未能解决你的问题,请参考以下文章