【问题标题】:Child classes not inheriting properties from parent class子类不继承父类的属性
【发布时间】:2012-11-01 20:33:22
【问题描述】:

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

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 类?

【问题讨论】:

    标签: php class inheritance parent-child


    【解决方案1】:

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

    正确代码:

    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);
    

    【讨论】:

    • 那么我只需要将parent::__construct(); 包含在Analysis 类的__construct() 函数中?
    • @Jeff - 你还需要传入$db,因为这是App 构造函数的参数。
    • 啊,好吧。我看到你在例子中做了什么。所以我想如果我要扩展我的 Standard 类,我只需将相同的参数传递给它,然后在新的扩展类中使用 parent::__construct() 来启动 Standard 类,依此类推。对吗?
    【解决方案2】:

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

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

    $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-05-03
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      相关资源
      最近更新 更多