0

我已经创建了这个父类

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 轻描淡写的问题。

4

4 回答 4

1

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

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

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

于 2012-10-02T16:43:17.077 回答
1

改变

private $mysqli;

protected $mysqli;

在当前班

于 2012-10-02T16:44:12.520 回答
1

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

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

        $this->data = $this->GET($table);
    }
于 2012-10-02T16:44:51.147 回答
0

DBMysqli你需要$mysqliprotected不是private

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

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

于 2012-10-02T16:43:55.767 回答