繁体   English   中英

如何在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”类的单个实例,而不是多次调用它。 请告诉我如何实现此目标。 我在Google呆了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);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM