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思维模式,在构造函数之前设置属性会导致空引用异常。太好了,我已经给出了答案。