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?
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/
Hi,
Hi:
about #55311.https://bugs.php.net/bug.php?id=55311I 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:
- the target method is declared as static
- 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/--
--
Etienne Kneuss
http://www.colder.ch
Hi:
2011/7/29 Etienne Kneuss colder@php.net:
Hi,
Hi:
about #55311.https://bugs.php.net/bug.php?id=55311I 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:
- the target method is declared as static
- There is no compatible object context at the time of the call.
I was wondering does this is well-documented? since when?
obviously, it is BC break to PHP 5.3.3.
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/--
--
Etienne Kneuss
http://www.colder.ch
--
Laruence Xinchen Hui
http://www.laruence.com/
Hello,
Hi:
2011/7/29 Etienne Kneuss colder@php.net:
Hi,
Hi:
about #55311.https://bugs.php.net/bug.php?id=55311I 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:
- the target method is declared as static
- 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/--
--
Etienne Kneuss
http://www.colder.ch--
Laruence Xinchen Hui
http://www.laruence.com/
--
Etienne Kneuss
http://www.colder.ch
Hi:
hmm, this make sense,
thanks for your explaining.
2011/7/29 Etienne Kneuss colder@php.net:
Hello,
Hi:
2011/7/29 Etienne Kneuss colder@php.net:
Hi,
Hi:
about #55311.https://bugs.php.net/bug.php?id=55311I 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:
- the target method is declared as static
- 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/--
--
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/
Hi,
2011/7/29 Laruence laruence@php.net:
Hi:
hmm, this make sense,
thanks for your explaining.
Actually this behavior change was introduced in 5.3.3 [1] and reverted in 5.3.4.
I.e. the BC just happens for 5.3.3 version.
[1] - https://bugs.php.net/bug.php?id=51176
--
Regards,
Felipe Pena