時,我有一個父類Database
如下PHP保持父類的屬性使用一個子類的構造函數
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爲null,並且它再次調用_openConnection( )。我有10個類擴展數據庫類和無論什麼類的構造它調用_openConnection()
。
我需要$ this-> fm在所有子類中進行訪問,只需要第一次調用_openConnection()
,並且需要所有類中的$ this-> fm。你如何做到這一點?
不會使靜態幫助嗎? –
'Login' *不是* __a__'數據庫'。它沒有業務「延伸」它。瞭解依賴注入。實例化一個'Database'一次,並將其傳遞給需要數據庫連接的所有類。 – deceze
@deceze你能稍微解釋一下嗎?這裏的可視性沒有問題。並且我在'Login'類中還有更多的方法以及 –