Re: [Bug #55311] Static methods invoke __call when called from within class
| From: | Laruence | Date: | Fri, 29 Jul 2011 09:43:57 +0000 |
| Subject: | Re: [Bug #55311] Static methods invoke __call when called from within class | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-54250@lists.php.net to get a copy of this message | ||
Hi:
hmm, this make sense,
thanks for your explaining.
2011/7/29 Etienne Kneuss <colder@php.net>:
> Hello,
>
> On Fri, Jul 29, 2011 at 11:10, Laruence <laruence@php.net> wrote:
>> Hi:
>>
>> 2011/7/29 Etienne Kneuss <colder@php.net>:
>>> Hi,
>>>
>>> On Fri, Jul 29, 2011 at 05:37, Laruence <laruence@php.net> wrote:
>>>> Hi:
>>>> about
>>>> #55311.https://bugs.php.net/bug.php?id=55311
>>>>
>>>> I found it maybe for some reason, that somebody change the
>>>> if/elseif sequence to make this bug.
>>>>
>>>> but I am not sure about why he do this, so I refer to maillist, any idea?
>>>
>>> This is not a bug.
>>>
>>> If you call a method using the Foo::bar() syntax, you don't
>>> necessarily get a static call.
>>>
>>> A static call is made if either:
>>>
>>> 1) the target method is declared as static
>>> 2) There is no compatible object context at the time of the call.
>>
>> I was wondering does this is well-documented? since when?
>
> It is not documented that way no, but it has always been documented
> that :: can be used to access overriden members in a non-static way.
> The actual rules behind static calls is a bit more general though, as
> described here.
>
>>
>> obviously, it is BC break to PHP 5.3.3.
>>
>
> To me it's simply a bug fix.
> Consider the following code:
>
> class A {
> public function __call() {
> echo "__call";
> }
>
> public function __callStatic() {
> echo "__callStatic";
> }
> }
>
> class B extends A {
> public function test() {
> parent::test();
> }
> }
>
>
> $b = new B;
>
> $b->test();
>
> It would simply be wrong to have callStatic being called here (it
> always called __call before __callStatic existed), so IMO the new
> behavior is fine, and even though fixing it introduced a BC break
> (like many bug fixes), it is now more consistent. Note that reverting
> it again would introduce a BC break as well with current 5_3.
>
> Best,
>
>> in PHP 5.3.3 __staticCall is in the front of the if/elseif statements.
>>
>> so I was very interesting to know why this was changed
>>
>>
>> thanks, ;)
>>
>>>
>>> In this case, it is not a static call, as the method is undeclared
>>> (hence cannot be declared as static) and you do have a compatible
>>> object context. So __call is used, not __callstatic.
>>>
>>> Best,
>>>
>>>>
>>>> Index: Zend/zend_object_handlers.c
>>>> ===================================================================
>>>> --- Zend/zend_object_handlers.c (revision 313905)
>>>> +++ Zend/zend_object_handlers.c (working copy)
>>>> @@ -988,13 +988,13 @@
>>>> if (!fbc && zend_hash_find(&ce->function_table,
>>>> lc_function_name,
>>>> function_name_strlen+1, (void **) &fbc)==FAILURE) {
>>>> efree(lc_function_name);
>>>>
>>>> - if (ce->__call &&
>>>> + if (ce->__callstatic) {
>>>> + return zend_get_user_callstatic_function(ce,
>>>> function_name_strval,
>>>> function_name_strlen);
>>>> + } else if (ce->__call &&
>>>> EG(This) &&
>>>> Z_OBJ_HT_P(EG(This))->get_class_entry &&
>>>> instanceof_function(Z_OBJCE_P(EG(This)), ce
>>>> TSRMLS_CC)) {
>>>> return zend_get_user_call_function(ce,
>>>> function_name_strval,
>>>> function_name_strlen);
>>>> - } else if (ce->__callstatic) {
>>>> - return zend_get_user_callstatic_function(ce,
>>>> function_name_strval,
>>>> function_name_strlen);
>>>> } else {
>>>> return NULL;
>>>> }
>>>> --
>>>> Laruence Xinchen Hui
>>>> http://www.laruence.com/
>>>>
>>>> --
>>>> PHP Internals - PHP Runtime Development Mailing List
>>>> To unsubscribe, visit: http://www.php.net/unsub.php
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Etienne Kneuss
>>> http://www.colder.ch
>>>
>>
>>
>>
>> --
>> Laruence Xinchen Hui
>> http://www.laruence.com/
>>
>
>
>
> --
> Etienne Kneuss
> http://www.colder.ch
>
--
Laruence Xinchen Hui
http://www.laruence.com/