php中如何访问私有变量,php关于__unset后访问私有变量的问题

本文探讨了PHP中的魔术方法`__get`和`__unset`在处理私有属性时的异常行为。当私有变量被`unset`后,再次访问该变量时,`__get`方法被意外调用。作者通过示例代码展示了这一现象,并寻求对这种自动调用机制的解释。输出结果显示,即使变量已`unset`,`__get`仍会被调用,有时甚至会执行两次。
摘要由CSDN通过智能技术生成

代码:

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!"."
";

else

$this->$elmname=$value;

}

function __isset($name){

return isset($this->$name);

}

function __unset($name){

unset($this->$name);

}

function __destruct(){

echo "
已经被摧毁!
";

}

function getp2(){

return $this->p2;

}

}

$example=new Example("v1","v2");

$example->p2="vs";//相当于调用了__set函数把$example的私有属性p2 设置为"vs".

echo $example->getp2()."
";//所以用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()."
";//此时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保密

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值