另一种类型的继承类

时间:2013-02-18 10:02:27

标签: php

对于我的项目,我写了一个基本的控制器类:

<?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类型。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

因为只有一个self::$__instance在从Controller继承的所有类之间共享。您可以使用数组来跟踪多个实例:

return self::$__instance[$class] ? self::$__instance[$class] : (self::$__instance[$class] = new $class());

但实际上,单身模式是不受欢迎的。您应该在定义的位置实例化new PageController一次并将其注入需要的位置。然后就不需要这个静态单例构造函数了。