如何在php中的所有子实例中只调用一次父构造函数


how to call parent constructor just once in all child instances in php

我正在尝试开发一个面向对象的PHP应用程序,其中整个PHP应用程序将从MyApplicationBase基类扩展。但问题是我只想创建MyApplicationBase的一个实例。下面是解释的代码

class MyApplicationBase{
    static $called=0;
        public var $db;
    function __construct()
    {
        self::$called++;
        echo "<pre>MyApplicationBase Created ".self::$called." times</pre>";        
                $this->db=new DatabaseWrapper();
    }
}
class ApplicationSecurity extends MyApplicationBase{
       function is_logged_in()
       {
            $res=$this->db->query("user check db query goes here");
            return ($res)?true:false;
       }
       //..... other methods related to ApplicationSecurity class
}
class ApplicationBusinessLogic extends MyApplicationBase{
     // business logic methods here which may use base class vars like $db
     // this may also use instance of ApplicationSecurity class
}
class ApplicationTemplating extends MyApplicationBase{
      protected function outputHeader()
      {
         require_once('path/to/themes/header.php');
      }
      protected function outputSidebar()
      {
         require_once('path/to/themes/siderbar.php');
      }
      protected function outputMainbody()
      {
        require_once('path/to/themes/mainbody.php');
        $app=new ApplicationBusinessLogic();
        $app->initiate();
      }
      protected function outputFooter()
      {
         require_once('path/to/themes/footer.php');
      }
      public function outputTemplate()
      {
         $this->outputHeader();
         $this->outputSidebar();
         $this->outputMainbody();
         $this->outputFooter();
      }
}
//index.php file code starts here--------
$myPhpApplication = new ApplicationTemplating();
$myPhpApplication->outputTemplate();

我的目标是,当我创建应用程序的实例时,它只调用"MyApplicationBase"类的单个实例,而不是多次调用它。请告诉我怎样才能做到这一点。我在谷歌上搜索了5个小时,但还找不到任何解决方案。

我正在尝试开发一个面向对象的PHP应用程序,其中整个PHP应用程序将从MyApplicationBase基类扩展而来。

由于PHP具有单一继承,这是迄今为止进行面向对象PHP编程时最糟糕的想法。

但问题是我只想创建MyApplicationBase的一个实例。

由于每个类都是MyApplicationBase,所以您实际上不希望这样,因为这意味着您可以在整个应用程序中实例化一个类。

您可能正在寻找的是某种ApplicationClass,它是您传递的,并且只存在一个实例。

这至少会让你在未来更容易地摆脱这样的"拦路虎",如果你从那里得到延长的话。

在任何情况下,您都应该针对ApplicationInterface而不是ApplicationClass进行编程,以使这种丢弃(因为这是必要的)更容易。

最好的事情肯定是不要朝着这个方向做任何事情,只写你首先需要的代码。

为了只编写您需要的代码,您需要开发测试驱动的代码。如果你想做面向对象的编程,为什么不从这个开始呢?

在这种情况下,我想您希望避免多次连接到数据库。依赖项注入的解决方案很简单,只需在MyApplicationBase类之外初始化数据库连接,然后将其作为构造函数参数传递(不过要注意构造函数地狱)。像这样:

class MyApplicationBase{
    static $called=0;
    public $db;
    function __construct($db)
    {
        self::$called++;
        echo "<pre>MyApplicationBase Created ".self::$called." times</pre>";        
                $this->db= $d;
    }
}
$db = new DatabaseWrapper();
$templating = new ApplicationTemplating($db);
$security = new ApplicationSecurity($db);

你也可以看看一些框架,它们通常带有一些依赖注入功能。