- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我已经搜索了许多 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);
关于php - call_user_func_array 将参数传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8023210/
第一次尝试处理这个 call_user_func_array,但有些东西不起作用,因为我没有收到函数的响应,我会遗漏什么? function _a_($id, $text) {
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
在组合数组时遇到了一些问题......这可行: $un[0] = array("0:0:0"); //$un[1] = array("1:1:1"); $flat = call
当函数包含引用参数时,下面的函数会产生错误,例如: function test(&$arg, &$arg2) { // some code } 现在我不能对上面的函数使用call_user_fun
我正在使用 mysqli 和准备好的语句为我的数据库编写一个简单的搜索引擎,我目前正在使用 call_user_func_array 来动态创建我的查询。我的问题是:使用 mysqli 是否有更快或更
我在 stack 上阅读了其他答案关于使用 call_user_func_array 与仅调用函数有关,但我仍然无法收集何时应该使用前者。我知道当您不知道传递了多少个参数时,您可能想使用 call_u
本周早些时候我看到了一段代码(不幸的是,我无法检索),我很好奇作者是如何实现 __call() 魔法方法的。代码如下所示: class Sample { protected function
我目前正在构建一个数据库处理程序。在 Firebird 数据库之上运行 PHP 5.4.16。 当我创建了准备好的语句后,我需要使用参数执行 SQL。我做了这个功能: private function
这个问题在这里已经有了答案: How to call the constructor with call_user_func_array in PHP (1 个回答) 关闭7年前。 我已经搜索了许多
这个问题在这里已经有了答案: How to call the constructor with call_user_func_array in PHP (1 个回答) 关闭7年前。 我已经搜索了许多
我使用的是 PHP 5.4.25。采取以下代码: 'John', 'last_name'=>'Doe']); call_user_func_array('fails', ['first_name'=>
这个问题已经有答案了: Sort array using array_multisort() with dynamic number of arguments/parameters/rules/dat
目前我正在使用: call_user_func( $func, $_POST['a'],$_POST['b'],$_POST['c'],$_POST['d'],$_POST['
我正在构建一个模板系统,但遇到了动态调用函数的问题。 当我尝试以下操作时: $args = array( 4, 'test' => 'hello', 'hi' ); 你知道..
PHP 的 call_user_func_array 在 Python 中是否有等效项? ? 最佳答案 以*开头的数组调用函数: function(*array) 关于Python 中的 PHP ca
我今天遇到了一个有趣的问题。我们有一个利用 Zend Frameworks 缓存功能的应用程序。对此应用程序的请求通常使用以下行调用工厂方法 $result = call_user_func_arr
这个问题在这里已经有了答案: Build SELECT query with dynamic number of LIKE conditions as a mysqli prepared state
我有一个方法,简化后看起来像这样: class Foo { public function bar($id) { // do stuff using $this, error occ
如何记录 call_user_func_array 中发生的 fatal error ?它位于作为守护进程运行的 CLI 脚本中。我想在发生错误时记录日志,但它总是抛回错误消息。 我尝试过但无法实现的
当使用 call_user_func_array() 我想通过引用传递一个参数。我该怎么做。例如 function toBeCalled( &$parameter ) { //...Do So
我是一名优秀的程序员,十分优秀!