【问题标题】:object oriented programming inheritance面向对象编程继承
【发布时间】:2012-09-23 13:23:23
【问题描述】:

我已经创建了这个父类

class DBMysqli {
    private $mysqli;

    function __construct($Mysqli) {
        $this->mysqli = $Mysqli;
    }

     public function GET($queryArr){

        $query = "SELECT ";

       ...

        $result = $this->mysqli->query($query); //Here I get a run time error!!
        echo $this->mysqli->error;

        return $result;
   }
}

还有一个子类

class FolderComment extends DBMysqli{

    protected $data;

    public function __construct() {
        $this->mysqli = DB::Simulator(); //works, initiliaze $mysqli
        $table = array(
            'tables' => 'folder_comments',
            'conditions' => '1'
        );

        $this->data = $this->GET($table);
    }
}

我收到运行时错误,指出 $this->mysqli 为空。但我已将其设置在子类中。我想这是一个 OOP 低估的问题。

【问题讨论】:

    标签: php class visibility


    【解决方案1】:

    我相信,由于您已将 mysqli 设为私有变量,因此不会像您假设的那样在子构造函数中设置它。如果您希望孩子能够访问它,它应该受到保护。

    因此发生的事情是,您在子类中创建了一个名为 mysqli 的新变量,因为它从一开始就从未从父类继承私有字段。

    您的另一个选择是隐式调用父级的构造函数并将mysqli 变量发送给它。

    【讨论】:

      【解决方案2】:

      DBMysqli 中,您需要将$mysqli 设为protected,而不是private

      class DBMysqli {
          protected $mysqli;
          //...
      

      Private 表示任何访问 - 无论是外部的还是继承的都被阻止,而 protected 表示外部访问被阻止,但继承的对象可以访问该属性。

      【讨论】:

        【解决方案3】:

        改变

        private $mysqli;
        

        protected $mysqli;
        

        在现阶段

        【讨论】:

          【解决方案4】:

          你需要将 mysqli 对象传递给你的父类

             public function __construct() {
                  parent::__construct(DB::Simulator());
                  $table = array(
                      'tables' => 'folder_comments',
                      'conditions' => '1'
                  );
          
                  $this->data = $this->GET($table);
              }
          

          【讨论】:

          • +1 我会采用这个解决方案,尽管每个人都是正确的。 IMO $mysqli 是 DMmysqli 封装实现的一部分,应该是私有的,我认为这是意图而不是错误。 DMmysqli 构造函数中提供了此依赖项的设置,因此应通过调用父构造函数来遵守现有合同。在 PHP 中,父构造函数不会被隐式调用,因此您必须自己调用父构造函数。
          • 这是一个完整的架构变化,虽然可能是一个有效的点(依赖注入是一件很棒的事情),但它进一步意味着他根本不应该使用继承......而不是$this->get应该是@ 987654323@,当您可以像与父类一样传递连接时,为什么会在子类中构建错误?
          • @Rudu 我原则上同意,但我认为我看到了一些尝试封装的迹象,所以我认为这个解决方案是 devmonster 的目标方向。可能并不是真的想提高 DIP 的标准,而只是朝着正确的方向轻推。
          猜你喜欢
          • 2011-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          相关资源
          最近更新 更多