首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码点火器-自定义结果对象方法访问非公共properties...without设置器?

问代码点火器-自定义结果对象方法访问非公共properties...without设置器?
EN

Stack Overflow用户
提问于 2019-07-13 01:14:56
回答 1查看 385关注 0票数 0

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

我想要建立一个模型,什么是通过自定义类重新生成结果,所以我使用了custom_row_object方法。

代码语言:javascript
复制
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');
}

}

这是我的班级

代码语言:javascript
复制
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 :)

}
}

} 

基于信息这里,我理解CI不应该直接访问这个属性,应该调用__set方法。

但是我很困惑,因为没有任何自定义构造函数,而且我的__set方法应该只修改一个密码属性--但是它不会,CI直接从数据库返回已经设置好的属性的对象!我唯一能做的修改就是添加一个构造函数,并在其中做如下修改

代码语言:javascript
复制
public function __construct(){
    $this->password = '****';
}

所以问题是-怎么可能?CI是使用了某种反射机制,还是我太笨了,而且我理解了文档错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-13 07:38:17

您可以在底层驱动程序中找到答案。

您可能使用mysql作为数据库,使用pdo / mysqli作为驱动程序。

在这两种情况下- Codeigniter使用fetchObject或fetch_object (MySQLi)方法。您可以在官方的Codeigniter上找到PDO 这里和MySQLi 这里的代码行。

如果您现在看一下文档- it cleary状态

PDO:

获取对象时,将从相应的列值分配其属性,然后调用其构造函数。

MySQLi:

mysqli_fetch_object()将作为对象返回当前行结果集,其中对象的属性表示结果集中找到的字段的名称。 注意,mysqli_fetch_object()在调用对象构造函数之前设置对象的属性。

资料来源- PHP文档:

PDOStatement::fetchObject

对象

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57015457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档