从子类获取父类的字段

问题描述:

假设我有两个类: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(); 

但我认为我不能做到这一点,至少,不是这样的。

那又怎么办?

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

可以使用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