PHP web 开发第三版中,对于__SET()和__GET()大概是这么说的:
在一个类中,可以访问一个特殊的指针—$this。如果当前类的一个属性为$attribute,则当该类中通过一个操作设置或访问该变量时,可以使用$this -> attribute来引用。 如下说明了如何在一个类中设置和访问属性:
是否可以在类的外部访问一个属性是由访问修饰符来确定的,关于访问修饰符以后详细介绍(我先说一下,public就是共有,private就是私有,私有只能在类的内部访问,
通常,从类的外部直接访问类的属性试糟糕的想法。面向对象方法的一个优点就是鼓励使用封装。可以通过使用__GET(),__SET()函数来实现对属性的访问。 )。(顺 便我说一下,对于没有接触过面向对象编程的初学者来说可能会误认为 $a是一个classname的实例,那么$a调用一个private的属性应该是可以的吧,这样应该不叫类外吧?这样理解是不对的。类内,类外就是指类 的定义部分而言,在这个定义(大花括号之内)部分内的就是类内。) |
class classname |
那么,我想说的是,如果有两个属性,是不是照样可以识别呢?(因为C#等中的get,set是对每一个属性分别设置的,所以我想测试一下)。我测试的代码如下:
<?php class test function __set($name,$value) function __get($name) }
$a -> age = "12"; |
不出所料,输出结果是,5 和 12。
这时,我想在输入名字$name这个属性的时候自动添加一个字符串进去,可以吗?于是我修改__SET函数为如下:
function __set($name,$value) |
测试: 结果还是 5 和 12。为什么呢?
我认为可能是因为定义属性的关键字 var 的问题,于是,我修改var 为 private,再测试就正常了!
后来,我又接着把访问修饰符改为public,protected测试,发现如果是 public 的就又不行了,而protected则正确。