class dog {
public $id = 0;
public function __construct($attributes = array()) {
foreach($attributes as $field=>$value){
$this->$field = $value;
}
}
}
$data = array('id' => 123);
$dog = new dog($data);
class poodle extends dog {
}
$poodle = new poodle();
var_dump($poodle->id);
var_dump給出0而不是123.這是玩具代碼而不是真實代碼,因此可能會出現一些語法錯誤,但應說明我的問題。擴展類實例無法訪問父代的注入屬性
作爲一個便箋,我將事物公開而不是保護起來,以便直接訪問,而不必設置50+個getter,並且因爲不需要對屬性進行驗證,並且其他代碼在設置後不會更改它們。
你爲什麼會想到的var_dump給你123?你創建一個'dog'類的實例並設置該實例的ID;當你創建你的'poodle'時,它是一個完全獨立的對象,你對這個對象做出的任何修改都不會影響到其他對象。 – andrewsi
@andrewsi我明白了。在那種情況下,你能否推薦我應該如何設計我的方法,讓獅子狗可以訪問123?在通過依賴注入初始化狗之後,我希望任何有dog擴展名的實例都能夠訪問更新屬性,例如123,而不是原來的。 –
據我所知,你不能直接通過擴展一個類來實現 - 對象是分開實例化的,所以一個屬性的改變將不會被另一個改變。我認爲你可以通過首先使用實例化你的'dog'對象,然後將該對象傳遞給其他對象。例如,您可以創建一個'數據庫'對象,並將其傳遞給'user'對象,然後可以使用它來查詢數據庫。 – andrewsi