#47402 [Asn->Fbk]: call_user_func propagating the scope while it didn't in 5_2
| From: | dmitry@php.net | Date: | Mon, 16 Feb 2009 16:25:06 +0000 |
| Subject: | #47402 [Asn->Fbk]: call_user_func propagating the scope while it didn't in 5_2 | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-133879@lists.php.net to get a copy of this message | ||
ID: 47402
Updated by: dmitry@php.net
Reported By: colder@php.net
-Status: Assigned
+Status: Feedback
Bug Type: Scripting Engine problem
PHP Version: 5.3.0beta1
Assigned To: dmitry
New Comment:
This is not a bug, but just an illustration of
is_callable/call_user_func mess which was fixed in 5.3 comparing to 5.2.
The following extended example illustrates inconsistent behaviour of
5.2. Using call_user_func() it passes $this in one case and not in the
other, however direct call passes %this in both cases.
<?php
class A {
public function test() {
B::foo();
call_user_func(array("B","foo"));
}
public function bar() {
var_dump($this);
}
}
class B extends A {
public function foo() {
var_dump($this);
}
public function test2() {
A::bar();
call_user_func(array("A","bar"));
}
}
$b = new B; $b->test(); $b->test2();
?>
PHP-5.2
-------
object(B)#1 (0) {
}
NULL
object(B)#1 (0) {
}
object(B)#1 (0) {
}
PHP-5.3
-------
object(B)#1 (0) {
}
object(B)#1 (0) {
}
object(B)#1 (0) {
}
object(B)#1 (0) {
}
Previous Comments:
------------------------------------------------------------------------
[2009-02-16 10:33:00] colder@php.net
Description:
------------
Depending on the context and the callback, call_user_func didn't
propagate $this in 5_2. It now does in 5_3. Not sure which one is more
correct, but there is definitely a potential BC break here.
Reproduce code:
---------------
<?php
class A {
public function test() {
B::foo();
call_user_func(array("B", "foo"));
}
}
class B extends A {
public function foo() {
var_dump($this);
}
}
$b = new B; $b->test();
?>
Expected result:
----------------
// 5_2's output
object(B)#1 (0) {
}
NULL
Actual result:
--------------
// 5_3's output
object(B)#1 (0) {
}
object(B)#1 (0) {
}
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=47402&edit=1