[英]PHP Keep parent class properties when using a child class constructor
我有一個父類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
,則拋出未定義的錯誤。 我搜索了一下,發現
在這個類的構造函數中,我需要使用
parent::__construct();
訪問父類的屬性。 如果我不使用parent::__construct();
那么當您在子類中有構造函數時,父類對象將不可訪問
現在,問題出在數據庫類$ fm為空,並且它再次調用_openConnection()。 我總共有10個類擴展了Database類,而無論哪個類都有構造函數,它都調用_openConnection()
。
我只需要一次調用_openConnection()
就可以在所有子類中訪問$ this-> fm,並且在所有類中都需要$ this-> fm。 您如何實現的?
讓我們澄清一下。 這些屬性是在對象級別上設置的。 這意味着,每次實例化創建對象的類時,該對象都是新對象,並且其屬性與實例化的其他對象不同(它們可能具有相同的值,但是它們存儲在不同的位置並且是獨立的)。
例:
class Database {
public $fm = "Value";
}
class Login extends Database {}
class PouleManipulation extends Database {}
$a = new Login();
$b = new PouleManipulation();
$b->fm = "New Value";
echo $a->fm; // prints "Value"
echo $b->fm; // prints "New Value"
您要查找的是靜態屬性,該屬性在類級別設置。 最好通過靜態方法訪問它。 這是一個簡單而骯臟的示例,但是您最好使用getter和setter。
class Database {
public static $fm = "Value";
}
class Login extends Database {}
class PouleManipulation extends Database {}
$a = new Login();
$b = new PouleManipulation();
$b::$fm = "New Value";
echo $a::$fm; // prints "New Value"
echo $b::$fm; // prints "New Value"
編輯:我使用您提供的代碼來解釋如何實現所需的內容,但我想強調一下Ryan Vincent在評論中寫的內容: Login
類應使用(而不是擴展) Database
類
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.