我不清楚为什么设计了私有属性又要去访问修改它,这样不又把权限降低了吗?既然要用到并修改它又为什么要设成私有属性呢?。纠结、、

解决方案 »

  1.   

    不一定是私有属性才会到__get __set呀! 调用一个类没有的属性就会触发__get,至于为什么这么干,就和为什么要把多个方法归为类一样。 我的语言组织能力如此了
      

  2.   

    __get()是外部调用未定义的属性时触发的方法,__set()是给一个未定义的属性赋值时触发的方法,和’私有属性‘有什么关系??
      

  3.   

    关于这两个方法:http://cn2.php.net/manual/zh/language.oop5.overloading.php#object.get如果属性定义了私有还能被外部调用和修改,那这个定义还有什么意义
      

  4.   

    将数据库的字段当作面对象来处理。这样修改字段很方便。如果楼主学过java,这就很好理解。
      

  5.   

    在给未定义的变量赋值时,__set() 会被调用。读取未定义的变量的值时,__get() 会被调用。其实定义私有变量的作用,不是说不能在外部用。只是可以通过方法,间接调用,
    私有属性只是在类内使用例如$this->attri
    但是私有属性也可以用在类内定义公共方法来访问。但是不能直接用类的对象名-》属性的方式访问
      

  6.   

    既然是“属性” =》 实例变量 那么可以修改就是必须的 (不然就不是变量了,是常量??)
    关键是谁能修谁不能修改:如果一个一个变量去声明(用private,public,protect)那么只能用关键字(private,public,protect)而且规则也比较单一。但是如果用__get和__set那岂不是就很灵活?比如(仅仅是比如)"_"开头是受保护的如果$obj->_id = 'modify id'的时候你就throw Exception。再则,在一些EAV模型的数据库中比如商品类 class Product{},你在设计之初根本不可能知道有多少个(扩展的)属性(你会说那我一类商品一个类,大不了多定义些类;那如果几万种商品呢?)那么用__get和__set就很方便举个例子Varien框架 (现在好像在这个基础上有个电商的前端magento)就充分利用了这个功能。而且如果配合implements ArrayAccess那么业务逻辑层在操作实体层的时候不就更加方便了。
      

  7.   

    通过_get/_set提供的->xxx形式界面,和原生的->xxx(public)是不同的,原生的->xxx是直接的赋值无法加入代码控制.
    _get/_set是可控制的,比如说如果你不需要修改xxx,只需要在_get/_set里不包含xxx
    换句话说,_get/_set只是getXXX()/setXXX()的另一种形式 那么,另一个问题是,为什么要提供这种形式,而不是让大家一律自己写getXXX/setXXX呢?
    一个方面是这种形式简单一点,但是估计更重要的是->XXX这种是可以嵌入到字符串里供解析,
    比如"....{$x->xxx}...."这样, 而getXXX这种必须写成"....".$x->getXXX()."...."
    那么,记住在php4里所有的对象的属性都是public的,因此,有很多存在的代码已经使用了,
    ->xxx这样的形式在字符串中,而且很多模板框架,包括smarty都是基于这种形式,
    所以,_get/_set这种形式可以更好的让很多现有代码继续工作而不需要大量修改