Re: [Bug #55311] Static methods invoke __call when called from within class

From: 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/

« previous php.internals (#54250) next »