|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-08-10 03:57 UTC] magicaltux@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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 14:00:01 2025 UTC |
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.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...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.