Php,Singletons Autoloading

时间:2010-12-31 15:59:54

标签: php oop design-patterns autoload

我使用spl_autoload_register为我的课程制作了标准自动加载器。但我有问题。 spl_autoload_register仅在我们使用new运算符实例化类时才开始工作。所以,当我在代码中有$singleton = Name\Singleton::get_instance()时,自动加载器不起作用,我应该手动包含这个文件。我怎么解决这个问题?

4 个答案:

答案 0 :(得分:3)

不应该是这种情况,只要需要,类就会自动加载。如果您正在使用名称空间,请尝试确保您的名称空间/类名是正确的。您也可以var_dump(class_exists('Name\Singleton'));检查该类是否存在,这肯定会使用自动加载器。

答案 1 :(得分:3)

无论天气如何创建对象或访问静态类,都会加载它们。

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

您应该查看以下链接,以帮助您使自动加载器正确。

http://groups.google.com/group/php-standards/web/psr-0-final-proposal

http://gist.github.com/221634

当声明命名空间提议时,每个根命名空间应该是供应商\<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()