Edit report at http://bugs.php.net/bug.php?id=49203&edit=1

 ID:                 49203
 Updated by:         [email protected]
 Reported by:        [email protected]
 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] [email protected]

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] [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/bug.php?id=49203&edit=1

Reply via email to