子类不从父类继承属性

时间:2012-11-01 20:33:22

标签: php class inheritance parent-child

这不符合我的想法。这是我的课程:

class App {
    public $db;

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

class Analysis extends App {

    public $analysis_id;

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

class Standard extends Analysis {

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

$db是我传递给App类的数据库(mysqli)对象。

当我尝试执行新的标准分析时,我这样启动它:

$analysis = new Standard($analysis_id);

Analysis类包含检索有关分析的元数据的方法,而Standard类包含检索特定类型分析的计算的方法。我以为我能够访问$db对象,但我无法从Analysis或Standard类中访问。我启动它时是否需要将$db对象传递给Standard类?

2 个答案:

答案 0 :(得分:6)

您的Analysis类需要在其父App上调用构造函数。默认情况下不会发生这种情况。因为$dbApp构造函数的参数,所以您必须从子类中传入此内容,然后从parent::__construct($db)构造函数中调用Analysis

正确的代码:

class App {
    public $db;

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

class Analysis extends App {
    public $analysis_id;

    public function __construct($analysis_id, $db) {
        $this->analysis_id = $analysis_id;
        parent::__construct($db);
    }
}

class Standard extends Analysis {
    public function __construct($analysis_id, $db) {
        parent::__construct($analysis_id, $db);
    }
}

$analysis = new Standard($analysis_id, $db);

答案 1 :(得分:3)

每个对象独立于其他对象。仅仅因为你在某处实例化App对象并不意味着其他任何东西都可以访问该对象中的数据,无论这些类是否相关。传递给$db实例的App参数在该对象中可用,并且仅在该对象中可用。

继承继承对象结构,而不是数据。

$app1 = new App($db);
$app2 = new App($db2); // <- different app instance, different data
$app3 = new App;       // <- does not have access to $db
$std  = new Standard;  // <- also does not have access to anything in $app1