51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> 其它 >> 文章正文

php关于__unset后访问私有变量的问题

更新时间:2012-1-12:  来源:51代码网

代码:
<?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保密

[1] [2] 下一页

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 赞助商链接
    推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |