Hi: hmm, this make sense, thanks for your explaining. 2011/7/29 Etienne Kneuss <col...@php.net>: > Hello, > > On Fri, Jul 29, 2011 at 11:10, Laruence <larue...@php.net> wrote: >> Hi: >> >> 2011/7/29 Etienne Kneuss <col...@php.net>: >>> Hi, >>> >>> On Fri, Jul 29, 2011 at 05:37, Laruence <larue...@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/ -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php