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

如何在php的所有子实例中只调用一次父构造函数,php,oop,Php,Oop,我正在尝试开发一个面向对象的PHP应用程序,其中整个PHP应用程序将从MyApplicationBase基类扩展而来。但问题是我只想创建MyApplicationBase的单个实例。下面的代码解释了我的意思 class MyApplicationBase{ static $called=0; public var $db; function __construct() { self::$called++; echo "&l

我正在尝试开发一个面向对象的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{
静态$called=0;
公共var$db;
函数_u构造()
{
self::$called++;
回显“MyApplicationBase Created”。self::$called.“times”;
$this->db=newdatabasewrapper();
}
}
类应用程序安全性扩展了MyApplicationBase{
函数已登录()
{
$res=$this->db->query(“用户检查db查询到这里”);
返回($res)?真:假;
}
//..…与ApplicationSecurity类相关的其他方法
}
类ApplicationBusinessLogic扩展了MyApplicationBase{
//这里的业务逻辑方法可能使用基类变量,如$db
//这也可以使用ApplicationSecurity类的实例
}
类ApplicationTemplateing扩展了MyApplicationBase{
受保护的函数outputhreader()
{
require_once('path/to/themes/header.php');
}
受保护的函数outputSidebar()
{
require_once('path/to/themes/siderbar.php');
}
受保护的函数outputMainbody()
{
require_once('path/to/themes/mainbody.php');
$app=新的ApplicationBusinessLogic();
$app->initiate();
}
受保护的函数outputFooter()
{
require_once('path/to/themes/footer.php');
}
公共函数输出模板()
{
$this->outputhreader();
$this->outputSidebar();
$this->outputMainbody();
$this->outputFooter();
}
}
//php文件代码从这里开始--------
$myPhpApplication=新应用程序模板();
$myPhpApplication->outputTemplate();

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

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

类MyApplicationBase{
静态$called=0;
公帑$db;
函数构造($db)
{
self::$called++;
回显“MyApplicationBase Created”。self::$called.“times”;
$this->db=$d;
}
}
$db=新的DatabaseWrapper();
$templating=新应用程序模板($db);
$security=新应用程序安全性($db);

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

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

类MyApplicationBase{
静态$called=0;
公帑$db;
函数构造($db)
{
self::$called++;
回显“MyApplicationBase Created”。self::$called.“times”;
$this->db=$d;
}
}
$db=新的DatabaseWrapper();
$templating=新应用程序模板($db);
$security=新应用程序安全性($db);
您还可以看看一些框架,它们通常带有一些依赖注入功能

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

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

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

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

您可能正在寻找的是某种应用程序类,您可以将其传递给其他应用程序类,其中只存在一个实例

这至少可以让你在将来更容易地扔掉这样一个“路障”,如果你能从那里得到延伸的话

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

最好的办法是不要朝着这个方向做任何事情,而只编写您首先需要的代码

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

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

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

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

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

您可能正在寻找的是某种应用程序类,您可以将其传递给其他应用程序类,其中只存在一个实例

这至少可以让你在将来更容易地扔掉这样一个“路障”,如果你能从那里得到延伸的话

在任何情况下,您都应该针对ApplicationInterface而不是ApplicationClass进行编程,以使这种情况不再发生,因为它将是这样
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);