Codeigniter-访问非公共属性的自定义结果对象方法...没有设置方法?

时间:2019-07-13 01:14:56

标签: codeigniter object model

我只是为客户处理一些项目,可能在文档中发现了一些错误或误导性描述。

我想创建一个模型,什么是自定义类的结果,所以我正在使用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是使用某种反射机制,还是我太愚蠢,我理解文档错了? :/

1 个答案:

答案 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文档:

PDOStatement::fetchObject

mysqli_result::fetch_object