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