我已经搜索了很多谷歌搜索结果的页面,以及这里的stackoverflow,但无法找到似乎适合我的情况的解决方案。我似乎只有一个最后的障碍,我试图建立的函数,它使用call_user_func_array来动态创建对象。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]);
该页面加载,因为它应该,并填充我正在建造的桌子。所以一切都是绝对有效的,直到我尝试在call_user_func_array
内实际使用我的$args
阵列。
有没有关于调用我缺少的数组的一些细微的细节?我一次阅读了call_user_func_array的PHP手册,然后看了一些,并且该页面上的示例似乎向人们展示了创建一个数组并将其称为第二个参数。我可能做错了什么?
谢谢你的回答,但是,我没有得到'无效回调'错误,并出现错误日志似乎表明'call_user_func_array'确实调用了构造函数,因为它给了我一个'PHP Warning:对于Product :: __ construct()'缺少参数1“,这是特定构造函数期望的五个参数中的每一个参数,但由于某种原因,接收。当然,这可能是我还不明白的,但那是我迄今所掌握的知识。 – tuespetre
您首先使用'new $ class'实例化对象。这意味着构造函数在'call_user_func_array'开始执行之前已经被调用。你看?首先来'new',因为你将它用作参数中的表达式,然后发生函数调用。但是由于正在执行的新元素,'$ class'的构造函数已经被调用(没有参数)。然后PHP尝试将该对象转换为字符串,因为第一个参数需要一个字符串或数组。因为你的对象不支持强制转换为字符串,你会得到错误/警告。 – hakre
我明白了!谢谢。我将研究将参数动态传递给构造函数的其他方法。 – tuespetre