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

标签 php mysql oop constructor

我已经搜索了许多 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/

相关文章:

c++ - 当我可以在头文件中声明和定义它时,为什么要创建一个 .cpp 文件?

c# - 枚举和继承

php - MYSQL JOIN 查询 vs PHP 循环查询性能

javascript - ReactJs 组件架构

javascript - 使用 js/jquery 在 ajax 表单提交之前需要创建 array/json

php - Wordpress/PHP/Ajax 加载更多帖子

mysql - sql语法错误执行查询

mysql - MariaDB 相当于 Oracle WHENEVER SQLERROR

mysql - 通过多个表获取MySQL数据

php - Laravel (OOP),模型特定值数组(例如用户头衔)