Req #49203 [Fbk->NoF]: call_user_func_array when calling a parent constructor not from a user class
| From: | php-bugs at lists dot php dot net | Date: | Mon, 18 Feb 2013 00:33:59 +0000 |
| Subject: | Req #49203 [Fbk->NoF]: 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-176749@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=49203&edit=1
ID: 49203
Updated by: php-bugs@lists.php.net
Reported by: magicaltux@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] magicaltux@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] jani@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] 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 https://bugs.php.net/bug.php?id=49203&edit=1