【发布时间】:2016-01-08 14:16:27
【问题描述】:
我有一个父类Database 如下
class Database{
/** @var Object Filemaker object across the application*/
protected $fm = null;
public function __construct(){
if($this->fm == null){
$this->_openConnection();
}
}
/**
* Function to open connection to FileMaker
* @return null
*/
private function _openConnection(){
$this->fm = new FileMaker();
}
}
我的一个孩子班是
class Login extends Database{
public function validate(){
// $this->fm is accessed here with no constructors
print_r($this->fm);
}
}
我正在创建对象,
$login = new Login();
$login->validate();
请注意,在这个 Login 类中,我没有任何构造函数。所以在$login = new Login(); 行,它调用了Database 类的构造函数并调用了_openConnection()。这很好
这是我的另一个子类:
class PouleManipulation extends Database{
private $year;
public function __construct(){
// $this->fm is only accessed if I call parent class constructor
parent::__construct();
$year = '2015';
}
public function processQueue(){
$this->fm->perform();
}
}
和
$pm = new PouleManipulation();
$pm->processQueue();
现在,当我调用$pm = new PouleManipulation(); 时,请注意我有一个此类的构造函数。如果我访问$this->fm,那么它会抛出一个未定义的错误。我google了一下,发现
在这个类构造函数中,我需要使用
parent::__construct();来访问父类属性。如果我没有使用parent::__construct();,那么当您在子类中有构造函数时,父类对象将无法访问
现在,问题在于数据库类 $fm 为空,它再次调用 _openConnection()。我总共有 10 个扩展数据库类的类,以及具有它调用 _openConnection() 的构造函数的任何类。
我需要在所有子类中访问 $this->fm,第一次只调用一次 _openConnection(),并且在所有类中都需要 $this->fm。你是怎么做到的?
【问题讨论】:
-
不会让 fm 静态帮助?
-
Login不是 aDatabase。它没有业务extending它。了解依赖注入。实例化一个Database一次,并将其传递给所有需要数据库连接的类。 -
@deceze 你能简单解释一下吗?并且这里的可见性没有问题。我在
Login类中还有更多方法 -
@deceze 那么我想我不明白这个问题。然而,告诉某人“学习依赖注入”并不能解决问题(我同意你的观点)。
-
@ash 我想了解这个问题并知道如何克服这个问题。 “学习依赖注入”并不能解决问题