0

私のプロジェクトでは、基本的なコントローラークラスを作成しました。

<?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($ page);

問題はvar_dump($page)、変数$ pageがUserControllerのタイプであることを示していることですが、なぜですか?タイプはPageControllerである必要があります。何か案は?

4

1 に答える 1

3

self::$__instanceから継承するすべてのクラス間で共有されるのは1つだけだからControllerです。配列を使用して、複数のインスタンスを追跡できます。

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

しかし、実際には、シングルトンパターンは嫌われています。定義された場所で一度インスタンス化new PageControllerし、必要な場所に注入する必要があります。その場合、この静的シングルトンコンストラクターは必要ありません。

于 2013-02-18T10:07:00.473 に答える