关于AR,比较喜欢使用 public 设置属性,但是...

设计AR的子类时,喜欢把一些公开的字段定义成 public 的方式,这样可以在类转换成数组,或者 JSON / XML 结构的数据时,不用另外配置和个判断哪些属性是可以公开的

当然现在是可以的,但是又想一些公开的字段不可以被修改(只读),按目前的方式,只能set/get的方式,这样就没有公开的属性了

现在我的解决方案是只管 public 定义属性,然后 override save方法,对attribute在不同的场景下,哪些字段不可以被修改进行过滤

不知道qiang是否更好的方案解决???

你说的“一些公开的字段不可以被修改”是什么意思?是指不允许被批量修改,还是不允许任何代码进行修改(包括单个赋值)?

使用 get_object_vars 函数可以获得对象已定义的属性,有的时候




class User extends CActiveRecord

{

    public id;

    public name;

    public age;


    ...

}



在程序中,可以直接 json_encode 获得 {id:"idvalue"; name: "namevalue"; age: "agevalue" } 结果;

为什么要这样做的原因是,我可以做通用action,根据请求所携带的不同 header 来不同的输出,如




$data['userList'] = User::model()->findAll();

$this->render('userList', $data);



如果用户是普通的请求,则显示页面 userList.htm

若用户请求的时候携带了特殊的 header, 如: x-request(AJAX请求),则直接返回JSON对象,这个JSON 对象是由 json_encode($data)获得,其中的 User 对象都可以根据之前的定义,输出公开的字段值