call_user_func_array 将参数传递给构造函数[重复]

2024-02-17

我已经搜索了许多 Google 结果页面以及 stackoverflow 上的此处,但找不到似乎适合我的情况的解决方案。我试图构建的函数似乎只有最后一个障碍,该函数使用 call_user_func_array 来动态创建对象。

我遇到的可捕获的致命错误是Object of class Product could not be converted to string。发生错误时,在日志中我会收到其中五个(每个参数一个):PHP Warning: Missing argument 1 for Product::__construct(),在可捕获的致命错误之前。

这是该函数的代码:

public static function SelectAll($class, $table, $sort_field, $sort_order = "ASC")
{  
/* First, the function performs a MySQL query using the provided arguments. */

$query = "SELECT * FROM " .$table. " ORDER BY " .$sort_field. " " .$sort_order;
$result = mysql_query($query);

/* Next, the function dynamically gathers the appropriate number and names of properties. */

$num_fields = mysql_num_fields($result);
for($i=0; $i < ($num_fields); $i++)
{
  $fetch = mysql_fetch_field($result, $i);
  $properties[$i] = $fetch->name;
}

/* Finally, the function produces and returns an array of constructed objects.*/

while($row = mysql_fetch_assoc($result))
{
  for($i=0; $i < ($num_fields); $i++)
  {
    $args[$i] = $row[$properties[$i]];
  }
  $array[] = call_user_func_array (new $class, $args);
}

return $array;
}

现在,如果我注释掉 call_user_func_array 行并将其替换为:

$array[] = new $class($args[0],$args[1],$args[2],$args[3],$args[4]);

页面按预期加载,并填充我正在构建的表。所以一切都绝对有效,直到我尝试实际使用我的$args数组内call_user_func_array.

关于调用该数组是否有一些我缺少的微妙细节?我读了一次 call_user_func_array 的 PHP 手册,然后读了一些,该页面上的示例似乎表明人们只是构建一个数组并为第二个参数调用它。我可能做错了什么?


你不能调用构造函数$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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

call_user_func_array 将参数传递给构造函数[重复] 的相关文章

随机推荐