这不符合我的想法。这是我的课程:
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类?
答案 0 :(得分:6)
您的Analysis
类需要在其父App
上调用构造函数。默认情况下不会发生这种情况。因为$db
是App
构造函数的参数,所以您必须从子类中传入此内容,然后从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