代码:
<?php
class Example{
private $p1;
private $p2;
function __construct($a,$b){
$this->p1=$a;
$this->p2=$b;
}
function __get($elmname){
echo "调用get啦!"; //为了跟踪get函数的调用,所以才输出!
if($elmname=="p2")
return "保密";
return $this->$elmname;
}
function __set($elmname,$value){
if($elmname=="p1"&&$value>100)
echo "error!"."<br/>";
else
$this->$elmname=$value;
}
function __isset($name){
return isset($this->$name);
}
function __unset($name){
unset($this->$name);
}
function __destruct(){
echo "<br/>已经被摧毁!<br/>";
}
function getp2(){
return $this->p2;
}
}
$example=new Example("v1","v2");
$example->p2="vs";//相当于调用了__set函数把$example的私有属性p2 设置为"vs".
echo $example->getp2()."<br/>";//所以用getp2()方法获得p2的值是vs
var_dump(isset($example->p2));//此时p2已被设置为vs所以输出bool(true)
unset($example->p2);//此时unset一下$example的私有属性p2
var_dump(isset($example->p2));//因为已经被unset了所以输出bool(false)
//以上部分暂时一切正常,但是因为已经用了unset,所以后面出现了一些我不能理解的事情
echo $example->getp2()."<br/>";//此时p2已经被unset了,所以没有值了,按理说应该不输出,可是神奇的一幕发生了,此时他竟然自动调用了__get函数,输出保密!
echo $example->p2;//于是我亲自调用了__get()函数,发现正常!
unset($example->p1);//然后我把p1也unset掉了!
var_dump(isset($example->p1));//所以这句也输出保密bool(false)
echo $example->p1;//神奇的一幕又发生了!同样是被unset掉的,这次我亲自调用的__get函数却执行了两遍
?>
————————————————————————
输出的结果是:
vs
bool(true) bool(false) 调用get啦!保密
调用get啦!保密bool(false) 调用get啦!调用get啦!
已经被摧毁!
————————————————————————
就是注释中提到的问题:关于__unset一个私有变量后,通过该类的函数访问该私有变量时发生的自动调用__get()函数的现象,和有时候调用__get()函数时却执行两次的现象!!
神奇啊!!
谁能帮我解释一下为什么会出现这些现象啊?为什么__unset一个私有变量后,再访问该变量的时候,__get()函数就会不正常的执行啊?能告诉我这里面具体的调用机制么?
当读取类的不存在的属性时,__get 方法就会被调用
你遇到的正是这个,没有什么不可理解的
我echo输出时添加了__LINE__结果是
36vs
bool(true) bool(false) 调用get啦!40保密