我使用spl_autoload_register为我的课程制作了标准自动加载器。但我有问题。 spl_autoload_register
仅在我们使用new运算符实例化类时才开始工作。所以,当我在代码中有$singleton = Name\Singleton::get_instance()
时,自动加载器不起作用,我应该手动包含这个文件。我怎么解决这个问题?
答案 0 :(得分:3)
不应该是这种情况,只要需要,类就会自动加载。如果您正在使用名称空间,请尝试确保您的名称空间/类名是正确的。您也可以var_dump(class_exists('Name\Singleton'));
检查该类是否存在,这肯定会使用自动加载器。
答案 1 :(得分:3)
无论天气如何创建对象或访问静态类,都会加载它们。
您的示例将在解析运算符::
之前加载类时工作文件,因此它在范围内。
您应该查看以下链接,以帮助您使自动加载器正确。
http://groups.google.com/group/php-standards/web/psr-0-final-proposal
和
当声明命名空间提议时,每个根命名空间应该是供应商\<Vendor Name>\(<Namespace>\)*<Class Name>
,您将执行以下操作(使用GitHub版本):
$App = new SplClassLoader('MyApp', '/myapp');
$App->register();
更新以帮助您更多地使用名称空间。
以此为例
namespace MyApp\Classes;
class SomeClass
{
public function __construct()
{
$Doctrine = Doctrine\Common\EntityManager::Singleton();
}
}
Doctrine调用将在EntityManager类的名称空间MyApp\Classes\Doctrine\Common
中查找。
你应该使用\
作为Doctrine命名空间的前缀,你应该总是指定一个\
来表示它不在当前的命名空间内。
在你的帖子中,这可能是它无效的原因。
答案 2 :(得分:1)
Actualy namspaces陷入了困境。
如果你有一个单身人士,你可能正在做这样的事情:
self :: $ _ instance = new self();
这会搞砸,因为它会因为一些邪恶的原因而向您的自动加载器抛出stdClass
,我甚至可以理解为什么或找到解决方案
编辑:Actualy我在这个答案上错了,我真的在构造函数上使用stdClass
所以我必须使用use函数从全局空间导入它,实际上我使用了一个(对象)的强制转换,无论哪种方式,我猜全球空间应始终可用。
在我导入stdClass之后,单身人士才开始工作
答案 3 :(得分:0)
我同意@Seldaek,并会查看您调用该方法的命名空间。当你调用静态方法时,你在哪个命名空间?如果您在“名称”命名空间中,则不需要在命名空间名称前加上类名。如果您在另一个名称空间中,则需要在方法调用前加上“\”以返回根名称空间,如$singleton = \Name\Singleton::get_instance()
。