Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用MySQLi获得正确实例化的对象_Php_Mysqli - Fatal编程技术网

Php 如何使用MySQLi获得正确实例化的对象

Php 如何使用MySQLi获得正确实例化的对象,php,mysqli,Php,Mysqli,有一种说法是,如果使用fetch\u object('classname'),它将在\u构造之前调用\u set方法。那么,如何在对象调用\uu set方法之前实例化它。这个Bug/特性是一个有趣的PHP缺陷。它在以下情况下非常方便: class MyModel { public $id; public $column2; public $column3; public function __construct() { //work with

有一种说法是,如果使用
fetch\u object('classname')
,它将在\u构造之前调用\u set方法。那么,如何在对象调用\uu set方法之前实例化它。

这个Bug/特性是一个有趣的PHP缺陷。它在以下情况下非常方便:

class MyModel {

    public $id;
    public $column2;
    public $column3;

    public function __construct() {
        //work with prefilled properties from database here
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
class MyModel {

    public $data;

    public function __construct($someOtherService) {
        $this->service = $someOtherService;
    }

    public function __set($name, $value) {
        $this->service->workWith($name, $value);
        $this->data[$name] = $value;
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
在这种情况下,它甚至起作用:

class MyModel {

    public $data;

    public function __construct() {
        //work with $this->data here
    }

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
但在这种情况下它会咬到你:

class MyModel {

    public $id;
    public $column2;
    public $column3;

    public function __construct() {
        //work with prefilled properties from database here
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
class MyModel {

    public $data;

    public function __construct($someOtherService) {
        $this->service = $someOtherService;
    }

    public function __set($name, $value) {
        $this->service->workWith($name, $value);
        $this->data[$name] = $value;
    }
}

$model = $mysqli->query()->fetch_object('MyModel');

这个Bug/Feature是一个有趣的PHP缺陷。它在以下情况下非常方便:

class MyModel {

    public $id;
    public $column2;
    public $column3;

    public function __construct() {
        //work with prefilled properties from database here
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
class MyModel {

    public $data;

    public function __construct($someOtherService) {
        $this->service = $someOtherService;
    }

    public function __set($name, $value) {
        $this->service->workWith($name, $value);
        $this->data[$name] = $value;
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
在这种情况下,它甚至起作用:

class MyModel {

    public $data;

    public function __construct() {
        //work with $this->data here
    }

    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
但在这种情况下它会咬到你:

class MyModel {

    public $id;
    public $column2;
    public $column3;

    public function __construct() {
        //work with prefilled properties from database here
    }
}

$model = $mysqli->query()->fetch_object('MyModel');
class MyModel {

    public $data;

    public function __construct($someOtherService) {
        $this->service = $someOtherService;
    }

    public function __set($name, $value) {
        $this->service->workWith($name, $value);
        $this->data[$name] = $value;
    }
}

$model = $mysqli->query()->fetch_object('MyModel');

没有办法。你所能做的就是解决这个bug/函数性问题。所以我只需使用
mysqli_结果
手动填充一个新对象,还是有更好的方法。取决于对象的性质。如果在_set()方法中使用了一些只在_构造方法中初始化的属性,则此错误只会影响您。如果您设法打破此依赖关系,则可能再次使用fetch_object()。对于没有_uset()方法的类,当前的实现很方便,因为在处理构造函数时数据是预先设置好的。我想我必须摆脱.Net思维模式,在构造函数之前设置属性会导致空引用异常。太好了,我已经给出了答案。没有办法。你所能做的就是解决这个bug/函数性问题。所以我只需使用
mysqli_结果
手动填充一个新对象,还是有更好的方法。取决于对象的性质。如果在_set()方法中使用了一些只在_构造方法中初始化的属性,则此错误只会影响您。如果您设法打破此依赖关系,则可能再次使用fetch_object()。对于没有_uset()方法的类,当前的实现很方便,因为在处理构造函数时数据是预先设置好的。我想我必须摆脱.Net思维模式,在构造函数之前设置属性会导致空引用异常。太好了,我已经给出了答案。