2014-10-06 62 views
1

CI custome对象的工作原理是什么?Codeigniter查询结果返回带设置者的自定义结果对象

按照CI文档,你也可以传递一个字符串,导致()代表一个类实例化的每个结果对象(注:这个类必须被加载)

$query = $this->db->query("SELECT * FROM users;"); 

foreach ($query->result('User') as $row) 
{ 
    echo $row->name; // call attributes 
    echo $row->reverse_name(); // or methods defined on the 'User' class 
} 
} 

这是一个非常不错的功能但是Ci所做的却是返回一个User对象的数组,并将行中的属性设置为它。

我有一个问题,我想要更多的控制什么属性被公开访问和什么被修改之前设置/获取。

我该如何做到这一点?我可以告诉CI将所有属性传递给构造函数,以便类可以填充它自己的数据吗?

例如类用户

class User{ 
    private $data=array(); 
    protected $CI; 
    //public $id,$name,$dob,$gender,$role,$username,$password,$salt,$picture,$lastactive; 
    function __construct($data=null) 
    { 
     $this->data = $data; // i want to save data to a private var and allow attr. throu getters only 
    } 
    function set_password($p){ 
     $this->generateSalt(); 
     $this->data->password = $p.$this->data->salt; 
    } 
} 

简而言之::

我想用custom_result_object但我不想笨来填充我的类属性,而不是我想要的类来接收这些ATTRS和用它适合的方式将它自己填充。

回答

4

我在为自己寻找解决方案时发现了你的问题。

文档中挖了一下后,我设法弄明白:

class user_item { 
    // you can declare all the attributes you want as private 
    private $id,$name,$dob,$gender,$role,$username,$password,$salt,$picture,$lastactive; 

    function __construct(){ 
    // you can use the constructor to format data as needed 
    $this->username = strtouppper($this->username); 
    } 

    public function set_password($p){ 
    $this->generateSalt(); 
    $this->password = $p.$this->salt; 
    } 

    public function get_password(){ 
    return $this->password; 
    } 
} 

一旦成立,你可以从$this->db->result()

class User_model extends CI_Model { 
    public function get_user($id){ 
    return $this->db->get_where('users', array('id' => $id), 1)->result('user_item'); 
    } 
} 

实例化这个类,并调用任何公共方法或属性根据需要的类别

class Users extends CI_Controller { 
    function __construct(){ 
    $this->load->model('user'); 
    } 
    public function profile($user_id){ 
    var $myUser = $this->user->get_user($user_id); 
    $myUser->set_password('myPassword'); 
    echo $myUser->get_password(); 
    } 
} 

我简化了co de让它更清晰,但你明白了。

+1

我很自豪CI社区仍然活跃:)。谢谢 – Zalaboza 2015-09-22 10:03:10

+0

然而,你把user_item类放在哪里?在图书馆? – NaturalBornCamper 2016-04-25 04:41:07

+1

@NaturalBornCamper我将它放在与User_model相同的文件中。所以当你执行'$ this-> load-> model('user')'时,它会自动加载。 – sulaiman 2016-04-27 06:33:14