【发布时间】:2013-03-12 17:20:21
【问题描述】:
我注意到,当我使用命名空间时,动态加载类与静态加载类的工作方式不同。因此,例如,在不使用命名空间的情况下,以下在实例化名为FooBar 的类的操作中是等效的:
$foobar = new FooBar();
和
$classname = "FooBar";
$foobar = new $classname;
但是,如果在使用命名空间时我有一些这样的代码:
<?php
namespace Structure\Library;
$foobar = new UserService();
$classname = "UserService";
$barfoo = new $classname;
在这种情况下,UserService 类的完全限定名称是 Structure\Library\UserService,如果我使用完全限定名称,它在两种情况下都有效,但如果我只使用 'UserService' 的快捷方式名称,它只有 em> 在使用静态方法实例化时有效。有没有办法让它对两者都有效?
附:我正在为所有类使用自动加载器......但我假设问题发生在自动加载器之前,并且正在影响传递给自动加载器的类字符串。
【问题讨论】:
-
被“它仅在使用静态方法实例化时才有效”感到困惑。您在哪里使用静态
::?对'Global Space'的问题理解? -
不抱歉,我的意思是对类的静态引用,而不是“静态类”。 :^) 明确地说,
$foobar=new UserService(); -
你能告诉我们你的自动加载器的逻辑吗?我想在里面,你使用命名空间来计算加载类文件的路径。那正确吗?难道你不能从自动加载器内部
echo你的$class名字,给我们一个更好的线索吗?正如 Allender 所回答的那样,我想正在发生的事情是正在处理的类名在一个实例中包含命名空间,但不包含在另一个实例中。本质上,您的代码的最后一行类似于编写:$barfoo = new \UserService();,但失败了,因为该类不在全局命名空间中。
标签: php namespaces