ID:               49203
 Updated by:       [email protected]
 Reported By:      [email protected]
 Status:           Open
 Bug Type:         Scripting Engine problem
 Operating System: Linux x86_64
 PHP Version:      5.3.0
 New Comment:

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...


Previous Comments:
------------------------------------------------------------------------

[2009-08-10 07:48:18] [email protected]

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] [email protected]

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/?id=49203&edit=1

Reply via email to