2013-10-20 117 views
0

假設我有兩個類:SuperObject和PageGenerator。從子類獲取父類的字段

PageGenerator(和一堆其他類)繼承SuperObject,並且SuperObject有一個名爲'db_conn'的字段用於數據庫連接。

所以我的代碼看起來是這樣的:

class SuperObject { 
    protected static $db_conn = null; 
    public function __construct($db){ $this->db_conn = $db; } 
} 
class PageGenerator extends SuperObject { 
    public function some_function(){ 
     //something using parent::$db_conn; 
    } 
} 
// somewhere down the way 
$so = new SuperObject($db_object); 
$page = new PageGenerator(); 
$page->some_function(); 

但我認爲我不能做到這一點,至少,不是這樣的。

那又怎麼辦?

回答

0
class SuperObject { 
    protected static $db_conn = null; 
    public function __construct($db){ self::$db_conn = $db; } 
} 
class PageGenerator extends SuperObject { 
    public function some_function(){ 
     var_dump(self::$db_conn); 
    } 
} 
// somewhere down the way 
$page = new PageGenerator(new \stdClass()); 
$page->some_function(); 
+0

呵呵。哇,那有效。做這樣的事情有什麼缺點嗎? – user2900816

+0

只是,你必須記住,靜態屬性是類屬性,但不是對象。這意味着,如果您將在某些情況下更改它,則會爲每個類實例更改靜態屬性的值。 – romik

0

可以使用parent保護靜態字段:

public function some_function(){ 
    var_dump(self::$db_conn); //not parent::$db_conn; 
} 

,但你不能在超對象正確intialize它。替換$這個 - > db_conn與自:: $ db_conn

class SuperObject { 
    protected static $db_conn = null; 
    public function __construct($db){ self::$db_conn = $db; } 
} 
+0

但這需要我打電話給那個班,我想避免內部的父類的構造函數。 – user2900816

+0

是的,我錯過了靜態關鍵字。以上正確答案 – ziollek