|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-02-16 10:33 UTC] 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) {
}
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 03:00:02 2025 UTC |
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) { }