Php 获取父类';子类中的s字段

Php 获取父类';子类中的s字段,php,Php,假设我有两个类:SuperObject和PageGenerator PageGenerator(和其他一些类)继承SuperObject,SuperObject有一个名为“db_conn”的字段用于数据库连接 所以我的代码看起来像: class SuperObject { protected static $db_conn = null; public function __construct($db){ $this->db_conn = $db; } } class Pa

假设我有两个类: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();
但我想我不能那样做,至少,不是那样的


那么该怎么办呢?

您可以使用受父级保护的静态字段:

public function some_function(){
     var_dump(self::$db_conn); //not parent::$db_conn;
}
但是你没有在SuperObject中正确初始化它。将$this->db_conn替换为self::$db_conn

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

但这需要我在类内部调用父类的构造函数,我想避免这种情况。哇,成功了。这样做有什么坏处吗?只是,您必须记住,静态属性是类属性,而不是对象。这意味着,若要在某个实例中更改静态属性的值,那个么每个类实例的静态属性的值都会更改。
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();