从子类获取父类的字段
问题描述:
假设我有两个类: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();
答
可以使用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
呵呵。哇,那有效。做这样的事情有什么缺点吗? – user2900816
只是,你必须记住,静态属性是类属性,但不是对象。这意味着,如果您将在某些情况下更改它,则会为每个类实例更改静态属性的值。 – romik