- Fixed bug #51176 (Static calling in non-static method behaves like $this->)

This commit is contained in:
Felipe Pena 2010-03-02 00:16:40 +00:00
parent fcf1058d6b
commit 79f618833f
7 changed files with 48 additions and 14 deletions

4
NEWS
View File

@ -69,7 +69,9 @@ PHP NEWS
- Fixed memory leak in the realpath cache on Windows. (Pierre)
- Fixed memory leak in zip_close. (Pierre)
- Fixed #51059 (crypt crashes when invalid salt are given). (Pierre)
- Fixed bug #51176 (Static calling in non-static method behaves like $this->).
(Felipe)
- Fixed bug #51059 (crypt crashes when invalid salt are given). (Pierre)
- Fixed bug #50952 (allow underscore _ in constants parsed in php.ini files).
(Jani)
- Fixed bug #50940 (Custom content-length set incorrectly in Apache SAPIs).

View File

@ -43,11 +43,11 @@ __call:
string(3) "ABC"
__call:
string(3) "ABC"
__call:
__callstatic:
string(3) "XYZ"
__call:
__callstatic:
string(3) "WWW"
__call:
__callstatic:
string(3) "ABC"
__callstatic:
string(1) "A"

View File

@ -35,17 +35,17 @@ call_user_func('self::y');
?>
--EXPECTF--
__call:
__callstatic:
string(3) "ABC"
__call:
__callstatic:
string(3) "ABC"
__call:
string(3) "xyz"
__call:
__callstatic:
string(3) "www"
__call:
string(1) "y"
__call:
__callstatic:
string(1) "y"
ok
__callstatic:

32
Zend/tests/bug51176.phpt Normal file
View File

@ -0,0 +1,32 @@
--TEST--
Bug #51176 (Static calling in non-static method behaves like $this->)
--FILE--
<?php
class Foo
{
public function start()
{
self::bar();
static::bar();
Foo::bar();
}
public function __call($n, $a)
{
echo "instance\n";
}
public static function __callStatic($n, $a)
{
echo "static\n";
}
}
$foo = new Foo();
$foo->start();
?>
--EXPECT--
static
static
static

View File

@ -28,9 +28,9 @@ foo::BAZ();
--EXPECT--
nonstatic
string(6) "fOoBaR"
nonstatic
static
string(6) "foOBAr"
nonstatic
static
string(6) "fOOBAr"
static
string(3) "bAr"

View File

@ -30,5 +30,5 @@ a::Foo();
--EXPECT--
__callstatic: Test
__call: Test
__call: Bar
__callstatic: Bar
__callstatic: Foo

View File

@ -953,13 +953,13 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, char *f
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;
}