Req #49203 [Opn->Fbk]: call_user_func_array when calling a parent constructor not from a user class
| From: | jani@php.net | Date: | Sat, 01 Jan 2011 21:47:07 +0000 |
| Subject: | Req #49203 [Opn->Fbk]: call_user_func_array when calling a parent constructor not from a user class | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-157486@lists.php.net to get a copy of this message | ||
Edit report at http://bugs.php.net/bug.php?id=49203&edit=1
ID: 49203
Updated by: jani@php.net
Reported by: magicaltux@php.net
Summary: call_user_func_array when calling a parent
constructor not from a user class
-Status: Open
+Status: Feedback
Type: Feature/Change Request
-Package: Feature/Change Request
+Package: Scripting Engine problem
Operating System: Linux x86_64
PHP Version: 5.3.0
Block user comment: N
Private report: N
New Comment:
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.
Previous Comments:
------------------------------------------------------------------------
[2009-08-10 08:29:09] magicaltux@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] colder@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] 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
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=49203&edit=1