2

这不像我想象的那样工作。这是我的课程:

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对象传递给标准类?

4

2 回答 2

7

您的Analysis类需要调用其父类的构造函数,App. 默认情况下不会发生这种情况。因为$dbApp构造函数的参数,所以你也必须从子类中传入 this,然后 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);
于 2012-11-01T20:35:24.430 回答
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
于 2012-11-01T20:38:10.570 回答