也许是迟到的东西,但这让我感到害怕。基本上我正在为练习编写框架,试图让我的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 ??
答案 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;
}