Edit report at https://bugs.php.net/bug.php?id=49203&edit=1
ID: 49203 Updated by: php-bugs@lists.php.net Reported by: magical...@php.net Summary: call_user_func_array when calling a parent constructor not from a user class -Status: Feedback +Status: No Feedback Type: Feature/Change Request Package: Scripting Engine problem Operating System: Linux x86_64 PHP Version: 5.3.0 New Comment: No feedback was provided. The bug is being suspended because we assume that you are no longer experiencing the problem. If this is not the case and you are able to provide the information that was requested earlier, please do so and change the status of the bug back to "Open". Thank you. Previous Comments: ------------------------------------------------------------------------ [2011-01-01 22:57:53] magical...@php.net Rather simple: if a given class's constructor is named with the class name (and not "__construct"), and is extended, then from the extending class: - calling parent::__construct() will work - calling call_user_func_array(array('parent', '__construct'), array()) won't The behaviour would usually be assumed to be the same, but it is not. ------------------------------------------------------------------------ [2011-01-01 22:47:06] j...@php.net What is the FR here? Re-type if this is actually a bug. And rewrite the summary, it isn't very informative. And update PHP version if this is still an issue. ------------------------------------------------------------------------ [2009-08-10 08:29:09] magical...@php.net Ok, mysqli's contructor is not named "__construct" Method [ <internal:mysqli, ctor> public method mysqli ] { } Still, one would expect that calling call_user_func_array(array('parent', '__construct'), ...) acts the same as parent::__construct(...) (which works). I guess somewhere the call to __construct must be redirected to the ctor... ------------------------------------------------------------------------ [2009-08-10 07:48:18] col...@php.net The problem is not about internal classes, but classes not defining a __construct: class A { } class B extends A { public function __construct() { echo "here\n"; call_user_func(array('parent', '__construct')); } } $x = new B; seems like is_callable() returns true on array('parent', '__construct') and shouldn't. ------------------------------------------------------------------------ [2009-08-10 03:57:09] magical...@php.net Description: ------------ When using: call_user_func_array(array('parent', '__construct'), $var); This works if the parent is a user-defined class, but not if it's an extension-provided class (the extended constructor gets called twice). This is not easy to explain, see attached reproduce code for more details. My initial code was (in a class extending mysqli): private function __construct($params) { call_user_func_array(array('parent', '__construct'), $params); $this->set_charset('utf8'); } Using this instead awfully fixes the problem: parent::__construct($params[0], $params[1], $params[2], $params[3]); Note that this wasn't possible in PHP 5.2.x Warning: call_user_func_array(): First argument is expected to be a valid callback, 'parent::__construct' was given in foo.php on line 5 Reproduce code: --------------- <?php class B extends mysqli { public function __construct($var) { echo "here\n"; call_user_func_array(array('parent', '__construct'), $var); } } $x = new B(array('localhost', 'root')); Expected result: ---------------- here Actual result: -------------- here here Warning: call_user_func_array() expects parameter 2 to be array, string given in foo.php on line 6 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=49203&edit=1