Jos*_*sto 17 php namespaces autoload symfony
之后编辑我自己的评论
我认为问题在于,当PHP将文件解析为"compile"时,首先它会将类名转换为完全限定名.因此索引将被转换为Controller\Home\Index.之后,是PHP将变量转换为其值.因此,如果我使用变量作为类名,它将不会限定其名称,因为该步骤已经发生.这就是为什么找不到课程.这只是一个猜测,但最有可能就是 Blockquote
结束编辑
我使用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
Run Code Online (Sandbox Code Playgroud)
这2个案例工作得很好.在第一个,因为我使用"使用Controller\Home;" 在我的脚本开头,我可以只使用"new Index();" 没有问题.但如果不是写"索引",而是使用像$ var ="Index"这样的字符串变量,它就不起作用了.我不明白为什么.我需要这个脚本是动态的,这就是为什么我需要一个变量.
谢谢!
额外的长尾搜索:
有趣的问题.从它的外观来看,它没有办法解决它.在PHP文档似乎明确说明这一点:
必须使用完全限定名称(带名称空间前缀的类名).
您的案例中可能的解决方法是在配置中为控制器定义基本命名空间,并通过其相对命名空间注册控制器.
假设基本命名空间是MyApp\Controller\,我们将控制器保存在一个数组中(为了简洁起见):
$controllers = array(
'foo/bar' => 'MyFooController',
'baz' => 'Foo\\MyBarController'
);
// One way how the controllers could be instantiated:
// returns 'MyApp\\Controller\\'
$namespace = $cfg->get('namespaces.controller');
$controller = $namespace.$controllers['baz'];
$controller = new $controller();
Run Code Online (Sandbox Code Playgroud)