__set/__get多情况讨论,因为涉及成员属性自动创建的问题,比VB中的property get/let/set要复杂
当一个对象变量(包括$this)试图引用一个难以达到的成员属性的时候自动触发__set/__get
所谓难以达到对不同的对象变量有不同的含义:
对类外部实例对象来说包括成员属性不存在和private/protected成员属性
对类内部$this或全局global$class来说仅指成员属性不存在
当最终访问的成员属性不存在时,这里的强调"最终",就是要不包括经过__set/__get的中间过程
如果是赋值,就会自动创建public成员变量
如果是取值,就会"Notice:未定义属性"
当没有可调用的__set/__get时
如果是因为private/protected成员属性,则产生中断错误,无法访问私有属性
如果是因为员属性不存在,同上
经过Set
经过Set
经过Get
设置私有成员但是参数倒置
通过上面的总结,分析上面这个类,当__set参数放反后所产生的结果
问题主要集中在为什么会有2次set,而最后又能正确调用get,返回正确的值
执行$demo->sx = "设置私有成员但是参数倒置";由于对象变量访问的是难以达到的私有成员,则自动引发__set
在__set中$n = '设置私有成员但是参数倒置',$v = 'sx'; 然后执行$this->$n = $v,相当于$this->设置私有成员但是参数倒置 = 'sx';
上面的执行过程,会再次调用__set,这是造成2次set原因,而且这种调用是递归性质的,第2次调用__set后,$n/$v再次转置,变成正确的顺序
这也就造成了__get能够正确执行
当把
$demo = new test;
$demo->sx = '设置私有成员但是参数倒置';
echo $demo->sx;
中的sx变成一个类中不存在的属性的时,输出结果中的get便会消失,因为在第2次调用__set时,会创建一个public成员,写入'设置私有成员但是参数倒置'
然后取值的时候,由于是取public成员,自然不经过__get
当一个对象变量(包括$this)试图引用一个难以达到的成员属性的时候自动触发__set/__get
所谓难以达到对不同的对象变量有不同的含义:
对类外部实例对象来说包括成员属性不存在和private/protected成员属性
对类内部$this或全局global$class来说仅指成员属性不存在
当最终访问的成员属性不存在时,这里的强调"最终",就是要不包括经过__set/__get的中间过程
如果是赋值,就会自动创建public成员变量
如果是取值,就会"Notice:未定义属性"
当没有可调用的__set/__get时
如果是因为private/protected成员属性,则产生中断错误,无法访问私有属性
如果是因为员属性不存在,同上
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<?
class test{
private $sx;
function __set($v, $n){
echo "经过Set<br>";
$this->$n = $v;
}
function __get($n){
echo "经过Get<br>";
return $this->$n;
}
}
$demo = new test;
$demo->sx = '设置私有成员但是参数倒置';
echo $demo->sx;
?>
输出结果:
经过Set
经过Set
经过Get
设置私有成员但是参数倒置
通过上面的总结,分析上面这个类,当__set参数放反后所产生的结果
问题主要集中在为什么会有2次set,而最后又能正确调用get,返回正确的值
执行$demo->sx = "设置私有成员但是参数倒置";由于对象变量访问的是难以达到的私有成员,则自动引发__set
在__set中$n = '设置私有成员但是参数倒置',$v = 'sx'; 然后执行$this->$n = $v,相当于$this->设置私有成员但是参数倒置 = 'sx';
上面的执行过程,会再次调用__set,这是造成2次set原因,而且这种调用是递归性质的,第2次调用__set后,$n/$v再次转置,变成正确的顺序
这也就造成了__get能够正确执行
当把
$demo = new test;
$demo->sx = '设置私有成员但是参数倒置';
echo $demo->sx;
中的sx变成一个类中不存在的属性的时,输出结果中的get便会消失,因为在第2次调用__set时,会创建一个public成员,写入'设置私有成员但是参数倒置'
然后取值的时候,由于是取public成员,自然不经过__get