Php,单例自动加载

Php,单例自动加载,php,oop,design-patterns,autoload,Php,Oop,Design Patterns,Autoload,我使用spl\U autoload\U寄存器为我的课程制作了standart autoloader。但我有问题spl\u autoload\u register仅当我们使用new操作符实例化一个类时,使其工作。所以,当我在代码中有:$singleton=Name\singleton::get_instance()时,autoloader无法工作,我应该手动包含此文件。如何解决此问题?不应该是这种情况,只要需要,类就会自动加载。如果使用名称空间,请确保名称空间/类名正确。您可以执行var_转储(c

我使用spl\U autoload\U寄存器为我的课程制作了standart autoloader。但我有问题
spl\u autoload\u register
仅当我们使用new操作符实例化一个类时,使其工作。所以,当我在代码中有:
$singleton=Name\singleton::get_instance()
时,autoloader无法工作,我应该手动包含此文件。如何解决此问题?

不应该是这种情况,只要需要,类就会自动加载。如果使用名称空间,请确保名称空间/类名正确。您可以执行
var_转储(class_存在('Name\Singleton'))以及检查类是否存在,这将确保使用自动加载程序。

无论您是创建对象还是访问静态类,它们都将被加载

您的示例将在解析运算符
之前加载类时工作文件,因此在其范围内

你应该看看下面的链接,以帮助你得到你的自动加载器刚刚好

正如名称空间方案所述,每个根名称空间都应该是一个供应商
\\(\)*
,您将执行以下操作(使用GitHub版本):


更新以帮助您更多地使用名称空间

就拿这个例子来说

namespace MyApp\Classes;

class SomeClass
{
    public function __construct()
    {
        $Doctrine = Doctrine\Common\EntityManager::Singleton();
    }
}
条令调用将在命名空间
MyApp\Classes\document\Common
中查找EntityManager类

您应该在其前面加上一个
\
,作为您的学说名称空间之外的名称空间。您应该始终指定一个
\
,表示它不在当前名称空间内


在您的帖子中,这可能是它不起作用的原因。

我同意@Seldaek的观点,并将研究您调用该方法的名称空间。调用静态方法时,您在哪个命名空间中?如果您在“Name”命名空间中,则不需要在类名之前加上命名空间名。如果您在另一个名称空间中,则需要在方法调用之前加上“\”以返回根名称空间,如
$singleton=\Name\singleton::get\u instance()

实际上,namspaces有些混乱

如果你有一个单身汉,你可能正在做这样的事情:

self::$\u实例=新self()

这会搞砸的,因为它会因为一些邪恶的原因向你的自动加载器抛出一个
stdClass
,我甚至无法理解为什么或者找到解决方案

编辑:实际上我在这个答案上错了,我在构造函数上使用了一个
stdClass
,所以我必须用use函数从全局空间导入它,实际上我使用了(object)的cast,无论哪种方式,我想全局空间应该总是可用的


在我导入stdClass之后,singleton就为gist post工作了

+1。我们也独立使用Doctrine2/Symfony2的自动加载器。工作很有魅力。是的,我相信信条/Zend等都遵守该文件。
namespace MyApp\Classes;

class SomeClass
{
    public function __construct()
    {
        $Doctrine = Doctrine\Common\EntityManager::Singleton();
    }
}