[英]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.