1

我正在尝试开发一个面向对象的 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 个小时,但还没有找到任何解决方案。

4

2 回答 2

1

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

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

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

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

您可能正在寻找的是某种您传递的 ApplicationClass,其中只有一个实例。

这至少可以让你在未来更容易扔掉这样一个“路障”,如果你从那里得到扩展的话。

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

最好的办法肯定是不要朝那个方向做任何事情,而只编写你首先需要的代码。

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

于 2013-08-31T12:12:16.313 回答
0

好吧,我想你想在这种情况下避免与数据库的多个连接。使用依赖注入的解决方案很简单,只需在 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);

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

于 2013-08-31T11:41:58.120 回答