初始化时,Singleton实例var不为null

时间:2011-07-26 21:09:53

标签: php binding static singleton design-patterns

也许是迟到的东西,但这让我感到害怕。基本上我正在为练习编写框架,试图让我的oop技能滚动,但我有点卡住了。我想我可能会遇到一个新手,我只是不知道:)

所以我有一个初始化整个程序的bootstrap类。我创建了一个控制器,您可以在其中调用应用程序(或模型,如果您愿意)。所有控制器和应用程序都是初始化类的子类,它实现单例模式。这是因为我想基于给定的控制器/应用程序将构造函数用于其他初始化东西。

现在的问题是,当我尝试从控制器内部启动应用程序时,实例var已经设置为控制器对象(我认为是null)。如果我不够清楚,这里是一个非常简化和原始形式的代码:

<?php

final class Bootstrap {
    public function __construct() {
        $controller = Controller::init();
        $controller->index();
    }
}

abstract class Initialization {
    private static $_instance = NULL;

    final public static function init() {
        $c = get_called_class();

        var_dump(self::$_instance);

        self::$_instance = new $c();

        return self::$_instance;
    }

    final protected function app($app) {
        $app::init();
    }
}

final class Form extends Initialization { }

final class Controller extends Initialization {
    final public function Index() {
        $this->app('form');
    }
}

$bootstrap = new Bootstrap();

?>

输出

null
object(Controller)[2]

我很困惑,为什么实例已经在表单app中设置?我认为它继承了它的“自己的”静态实例var ??

1 个答案:

答案 0 :(得分:3)

如果使用后期静态绑定(例如static::$_instance而不是self::$_instance)调用它,则只能获得“自己的”静态实例var。此外,您还希望将其设为protected而不是private

self::是在编译时确定的,因此总是会引用Initialization::$_instance,无论你将它调用哪个类扩展它。程序运行时确定static::

代码更改:

abstract class Initialization {
    protected static $_instance = NULL;

    final public static function init() {
        $c = get_called_class();
        static::$_instance = new $c();
        return static::$_instance;
    }