Hello,
On Fri, Jul 29, 2011 at 11:10, Laruence <[email protected]> wrote:
> Hi:
>
> 2011/7/29 Etienne Kneuss <[email protected]>:
>> Hi,
>>
>> On Fri, Jul 29, 2011 at 05:37, Laruence <[email protected]> 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
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php