我只是为客户处理一些项目,可能在文档中发现了一些错误或误导性描述。
我想创建一个模型,什么是自定义类的结果,所以我正在使用custom_row_object方法。
class UserModel extends CI_Model {
public function __construct(){
parent::__construct();
$this->load->library('Class_loader'); /custom spl loader
}
public function get_user_by_email($email, $password = null){
$this->db->where('email',$email);
$result = $this->db->get('User');
return $result->custom_row_object(0,'User');
}
}
这是我的课程
class User {
private $idUser;
private $password;
private $email;
private $role;
public function __construct() {
echo 'instancja';
echo $this->password;
}
public function __set($name, $value) {
if ($name === 'password') {
$this->password = '****' // only for testing purposes :)
}
}
}
基于信息here,我了解CI不应直接访问此属性,而应调用__set方法。
但是我很困惑,因为没有任何自定义构造函数,而我的__set方法应该只修改密码属性-但是不会,CI直接从数据库返回具有已设置属性的对象!我唯一可以做的修改就是添加一个构造函数,并像这样修改它
public function __construct(){
$this->password = '****';
}
问题是-怎么可能? CI是使用某种反射机制,还是我太愚蠢,我理解文档错了? :/
答案 0 :(得分:0)
您可以在基础驱动程序中找到答案。
您可能将mysql用作数据库,将pdo / mysqli用作驱动程序。
在两种情况下-Codeigniter使用fetchObject
(PDO)或fetch_object
(MySQLi)方法。
您可以在官方的Codeigniter Github存储库中找到PDO here和MySQLi here的以下代码行。
如果您现在看一下文档-明确指出
PDO:
获取对象时,将从相应的列值中分配其属性,然后调用其构造函数。
MySQLi:
mysqli_fetch_object()将作为对象返回当前行结果集,其中对象的属性表示在结果集中找到的字段的名称。
请注意,mysqli_fetch_object()在调用对象构造函数之前先设置对象的属性。
来源-PHP文档: