Edit report at https://bugs.php.net/bug.php?id=55731&edit=1

 ID:                 55731
 User updated by:    421034509 at qq dot com
 Reported by:        421034509 at qq dot com
 Summary:            __get after __unset
 Status:             Bogus
 Type:               Bug
 Package:            Unknown/Other Function
 Operating System:   windows xp
 PHP Version:        5.3.8
 Block user comment: N
 Private report:     N

 New Comment:

Thanks for your explain,but there is something I still can't understand.
In 2:what's the "called out from $Example->ce" mean?
(Sorry!My English is poor and I have studied PHP a short time)
Do you mean I call $example->p1 out of the class?
If so,I call $example->p2 out of the class too.
Then,in my custom getter, I attempt fetch $this->p2.
in this case, it attempt to access p2 in example class scope ,
why dosn't it call getter again?
Can you explain why $example->p2 call getter only once for me like before?


Previous Comments:
------------------------------------------------------------------------
[2011-09-20 09:42:43] larue...@php.net

I have give you a example which will only call get once after unset, and okey, 
if you want a 
more specific explain, here we go:

1. you call $example->p1
2. zend vm call read_propery , in which internal will check property_info and 
socpe, since this 
is called out from example->ce, so get_property_info will deny and return NULL, 
then zend vm 
assume you are try to access a public "p1"()
3. so zend vm set a getter_guard for "p1" and call getter try to find "p1" 
(output 
"call_get()!")
4. in your custom getter, you attempt fetch $this->p1
5. in this case, you attempt to access p1 in example class scope , so 
get_property_info 
successed, and return a property info with name "\0Example\0p1"
5. zend vm try to fetch "\0Example\0p1" now, set a getter_guard for 
"\0Example\0p1"  and call 
getter again (output "call_get()!")
7. zend vm found call getter in getter(by gettter_guard which was setted in 5), 
then give up, 
and return.

------------------------------------------------------------------------
[2011-09-20 08:47:14] 421034509 at qq dot com

I want to know what happened after __unset.
$example->p1 has bean unset and $example->p2 is never set.
But isset($example->p1)) and isset($example->p2)) are all false.
Why $example->p2 call __get once but $example->p1 call __get twice?
What's the diference of the $example->p1 which has bean unset and the 
$example->p2 which is never set"?

------------------------------------------------------------------------
[2011-09-20 04:07:07] larue...@php.net

see blow, and I think you will find out the reason:
<?php
class Example{
    private $p1;
    function __construct($a){
        $this->p1=$a;
    }
    function __get($elmname){
        echo "Call_get()!"; //In order to follow the method __get()
    }
    function __unset($name){
        unset($this->$name);
    }
}
$example = new Example("v1");
unset($example->p1);
echo $example->p1;

------------------------------------------------------------------------
[2011-09-20 02:35:23] 421034509 at qq dot com

Description:
------------
<?php
  class Example{
  private $p1;
  private $p2;
  function __construct($a){
  $this->p1=$a;
  }
  function __get($elmname){
  echo "Call_get()!"; //In order to follow the method __get()
  return $this->$elmname;
  }
  function __isset($name){
  return isset($this->$name);
  }
  function __unset($name){
  unset($this->$name);
  }
 }
 $example=new Example("v1","v2");  
 echo $example->p1."<br/>";
 var_dump(isset($example->p2));//p2 is uninitialized,the result is bool(false)
 echo $example->p2;//This time,__get is called by 1 time.
 unset($example->p1);
 var_dump(isset($example->p1));//Because of __unset,the result is bool(false)
 echo $example->p1;//Amazing!I call the __get just once,but it seems that the 
__get method has bean called two times!
?>

Expected result:
----------------
Call_get()! v1
bool(false) Call_get()!bool(false) Call_get()!

Actual result:
--------------
Call_get()! v1
bool(false) Call_get()!bool(false) Call_get()!Call_get()!


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=55731&edit=1

Reply via email to