gpt4 book ai didi

php - call_user_func_array 将参数传递给构造函数

转载 作者:IT王子 更新时间:2023-10-28 23:47:01 27 4
gpt4 key购买 nike

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

我得到的可捕获的 fatal error 是 无法将类 Product 的对象转换为字符串。发生错误时,在日志中我得到其中的五个(每个参数一个):PHP 警告:Product::__construct() 缺少参数 1, 在可捕获的 fatal error 之前。

这是函数的代码:

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]);

页面按应有的方式加载,并填充我正在构建的表格。所以在我尝试在 call_user_func_array 中实际使用我的 $args 数组之前,一切都是绝对正常的。

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

最佳答案

你不能像这样调用$class的构造函数:

call_user_func_array (new $class, $args);

那不是 valid 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,但这里不讨论,我只是为了完整性而命名)。

因为 $obj 是一个对象而不是有效的回调,所以您会看到 PHP 错误消息:

Object of class Product could not be converted to string.

PHP 试图将对象转换为字符串,这是它不允许的。

因此,正如您所见,您无法轻松地为构造函数创建回调,因为该对象尚不存在。也许这就是为什么您无法轻松地在手册中查找它的原因。

构造函数在这里需要一些特殊处理:如果您需要将可变参数传递给尚未初始化对象的类构造函数,您可以使用 ReflectionClass这样做:

  $ref = new ReflectionClass($class);
$new = $ref->newInstanceArgs($args);

参见 ReflectionClass::newInstanceArgs

关于php - call_user_func_array 将参数传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8023210/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com