我正在尝试开发一个面向对象的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);
你也可以看看一些框架,它们通常带有一些依赖注入功能。