对于我的项目,我写了一个基本的控制器类:
<?php
abstract class Controller
{
static $__instance = null;
protected function __construct()
{
}
final private function __clone()
{
}
public static function getInstance()
{
$class = get_called_class();
return self::$__instance ? self::$__instance : (self::$__instance = new $class());
}
}
?>
现在每个控制器都从该控制器继承。
像这样:
<?php
include_once 'model/page.php';
include_once 'view/page.php';
class PageController extends Controller
{
private $m_model = null;
private $m_view = null;
private $m_id;
protected function __construct()
{
parent::__construct();
$this->m_id = uniqid();
$this->m_model = new PageModel();
$this->m_view = new PageView();
}
public function preparePage()
{
echo 'Hello';
}
}
?>
在我的index.php中我得到了这个: $ user = UserController :: getInstance(); $ page = PageController :: getInstance(); 的var_dump($页);
问题是var_dump($page)
显示变量$ page是UserController的类型,但为什么呢?它应该是PageController类型。有什么想法吗?
答案 0 :(得分:3)
因为只有一个self::$__instance
在从Controller
继承的所有类之间共享。您可以使用数组来跟踪多个实例:
return self::$__instance[$class] ? self::$__instance[$class] : (self::$__instance[$class] = new $class());
但实际上,单身模式是不受欢迎的。您应该在定义的位置实例化new PageController
一次并将其注入需要的位置。然后就不需要这个静态单例构造函数了。