2015-11-30 146 views
0
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,並且因爲不需要對屬性進行驗證,並且其他代碼在設置後不會更改它們。

+0

你爲什麼會想到的var_dump給你123?你創建一個'dog'類的實例並設置該實例的ID;當你創建你的'poodle'時,它是一個完全獨立的對象,你對這個對象做出的任何修改都不會影響到其他對象。 – andrewsi

+0

@andrewsi我明白了。在那種情況下,你能否推薦我應該如何設計我的方法,讓獅子狗可以訪問123?在通過依賴注入初始化狗之後,我希望任何有dog擴展名的實例都能夠訪問更新屬性,例如123,而不是原來的。 –

+0

據我所知,你不能直接通過擴展一個類來實現 - 對象是分開實例化的,所以一個屬性的改變將不會被另一個改變。我認爲你可以通過首先使用實例化你的'dog'對象,然後將該對象傳遞給其他對象。例如,您可以創建一個'數據庫'對象,並將其傳遞給'user'對象,然後可以使用它來查詢數據庫。 – andrewsi

回答

0

您需要將父項的構造添加到擴展類中。

class poodle extends dog { 

    public function __construct(){ 
     parent::__construct(); 
    } 

} 
+0

不幸的是,當我在我的代碼中嘗試它。它仍然給出0而不是123. –

1

我認爲你誤解了物體是如何工作的。

class dog { 

    public $id = 0; 
    public function __construct($attributes = array()) { 

     foreach($attributes as $field=>$value){ 
      $this->$field = $value; 
     } 

    } 
} 

class poodle extends dog { 
} 

當我呼籲dog類的結構,我得到一個dog對象;這是一個單獨的變量,本身就是完整的。如果我然後創建一個poodle對象,那是一個新的獨立對象。該類基本上是一個藍圖,用於顯示對象在創建時的外觀 - 當您更改對象的值時,您不能再更改該類本身。

對於你想要做的事情,你必須以不同的方式來處理它 - 你不能在一個對象中設置一個值,然後能夠訪問另一個對象中的值。相反,如下所示:

class DB { 
    public function __construct($attributes) { 
     // set up database connection here 
    } 
} 

class User { 
    public $DB; 

    public function __construct ($DB) { 
     $this->DB = $DB; 
    } 
} 

$myDB = new DB(); 
$myUser = new User($DB); 

可讓您設置單個數據庫類,您可以將其傳遞到第二個對象;您的數據庫對象中所做的更改將過濾進您的用戶

+0

User和DB之間的關係是依賴注入 - 調用構造函數注入。 –

0

獅子狗從狗身上延伸出來,然後獅子狗也是狗。 $ poodle = new poodle()是爲了創建新的對象,然後它總是爲id屬性返回Zero,因爲它是新對象。

嘗試:

$data = array('id' => 123); 
$dog = new dog($data); 
var_dump($poodle->id); 

$poodle = new poodle($data); 
var_dump($poodle->id);