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

From: Date: Fri, 29 Jul 2011 08:28:21 +0000
Subject: Re: [Bug #55311] Static methods invoke __call when called from within class
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-54247@lists.php.net to get a copy of this message
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. 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

« previous php.internals (#54247) next »