你不能调用构造函数$class
像这样:
call_user_func_array (new $class, $args);
那不是有效回调 http://php.net/callback作为第一个参数。让我们把这个分开:
call_user_func_array (new $class, $args);
是相同的
$obj = new $class;
call_user_func_array ($obj, $args);
正如你所看到的,构造函数$class
之前已经被调用过call_user_func_array
开始行动。由于它没有参数,您会看到以下错误消息:
Missing argument 1 for Product::__construct()
紧接着,$obj
是对象类型。有效的回调必须是字符串或数组(或者特别是非常特殊的对象:Closure http://www.php.net/manual/en/class.closure.php,但这不在此处讨论,我只是为了完整性而命名)。
As $obj
是一个对象而不是有效的回调,因此您会看到 PHP 错误消息:
Object of class Product could not be converted to string.
PHP 尝试将对象转换为字符串,但它不允许这样做。
正如您所看到的,您无法轻松地为构造函数创建回调,因为该对象还不存在。也许这就是为什么您无法轻松地在手册中查找它的原因。
构造函数在这里需要一些特殊处理:如果需要将变量参数传递给尚未初始化对象的类构造函数,则可以使用ReflectionClass http://php.net/ReflectionClass去做这个:
$ref = new ReflectionClass($class);
$new = $ref->newInstanceArgs($args);
See ReflectionClass::newInstanceArgs http://www.php.net/manual/en/reflectionclass.newinstanceargs.php