【发布时间】:2011-12-18 08:28:02
【问题描述】:
之后编辑我自己的评论
我认为问题在于,当 PHP 解析文件以“编译”时,首先它将类名转换为完全限定的 姓名。所以Index会被翻译成Controller\Home\Index。后 那就是 PHP 将变量转换为它们的值的时候。所以如果我使用 变量作为类名,它不会限定其名称,因为 步骤已经发生。这就是为什么找不到课程的原因。 这只是一个猜测,但很可能是这样的 块引用
结束编辑
我正在使用 Symfony2 项目中的 UniversalClassLoader 来自动加载我的类,但我发现了一些我无法解决的奇怪错误。
自动加载工作正常,但后来我遇到了这个问题:
$controller = new Index(); // It works!
$controller_name = "Controller\\Home\\Index";
$controller2 = new $controller_name(); // It works!
$controller_name = "Index";
$controller3 = new $controller_name(); // Fatal error: Class 'Index' not found
前两个案例工作得很好。在第一个中,因为我使用“使用 Controller\Home;”在我的脚本开始时,我可以只使用“new Index();”没有什么问题。但是,如果我不写“Index”,而是使用像 $var = “Index”这样的字符串变量,它就不起作用。我不明白为什么。 我需要这个脚本是动态的,这就是为什么我需要一个变量。
谢谢!
额外的长尾搜索:
- 来自变量的 php 完全限定名
- php 从变量中的别名实例化类
【问题讨论】:
-
您的脚本顶部是否有
namespace或use声明?这可能就是new Index()起作用的原因。 -
是的,我愿意。这就是为什么它适用于第一种情况,但我希望第三种情况也能正常工作。我该怎么办?
-
我的猜测是 PHP 在定位非限定符号而不是字符串时只使用
use子句。看起来您需要在字符串中指定全名,即$controller_name = '\Controller\Home\Index'; -
我认为问题在于当 PHP 解析文件以“编译”时,它首先将类名转换为它们的完全限定名。所以Index会被翻译成Controller\Home\Index。在那之后,就是 PHP 将变量转换为它们的值的时候。所以如果我使用一个变量作为类名,它不会限定它的名字,因为那一步已经发生了。这就是为什么找不到课程的原因。这只是一个猜测,但很可能就是这样。
标签: php namespaces symfony autoload