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: Thank you very much!You are so kind and patient! I see your blog! It's great! æ¨ä¹æ¯ä¸å½äººåï¼ æç°å¨å¤§åï¼ç°å¨å¨å京å¦ä¹ ï¼åæ¥è§¦php!叿以åè¿è½è¯·ææ¨ï¼ Previous Comments: ------------------------------------------------------------------------ [2011-09-21 08:07:48] larue...@php.net kind of right, you can refer to zend_std_read_property(in Zend/zend_object_handlers.c) for more details. and btw, you seems to be a chinese(using qq email), so if you are interesting of php internal, plz look at laruence.com, I will write these down in chinese in couple of days ------------------------------------------------------------------------ [2011-09-21 07:42:19] 421034509 at qq dot com p1: You mean __unset() made the p1 out of $example->properties? When get_property_info successed, zend vm return a property info with name "\0Example\0p1" but it can't find p1 in $example->properties ? So zend vm try to fetch "\0Example\0p1" and set a getter_guard for "\0Example\0p1" and call getter again. p2: When get_property_info successed, zend vm return a property info with name "\0Example\0p2" and p2 can be found in $example->properties. So zend vm wont try to fetch "\0Example\0p1" but successed and return p2? ------------------------------------------------------------------------ [2011-09-21 03:32:28] larue...@php.net p2 is a litte different, see blow: 1. you call $example->p2 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 "p2"() 3. so zend vm set a getter_guard for "p2" and call getter try to find "p2" (output "call_get()!") 4. in your custom getter, you fetch $example->p2 5. zend vm call read_property, the first begining is similar to the situation when you trying to fetch p1, but, zend vm find p2 in $example->properties(this it the key difference), then suceed and return. ------------------------------------------------------------------------ [2011-09-21 00:48:39] 421034509 at qq dot com 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? ------------------------------------------------------------------------ [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. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=55731 -- Edit this bug report at https://bugs.php.net/bug.php?id=55731&edit=1