PHP调用具有可变参数量的函数

时间:2010-02-26 17:06:37

标签: php reference pass-by-reference

所以我遇到了一个问题。我知道一个解决方案,但它看起来不是很干净,我想知道是否有更好的解决方案。

我正在编写一个用于运行预准备语句的MySQLi包装器。由于它是一个包装器,并且意味着可以重用(动态),返回的列数取决于查询而不是静态的。

我发现的一个解决方案,似乎是每个人都使用的解决方案,是call_user_func_array

它有效,但我的问题是它让我创建了一个额外的引用数组,我不应该首先需要它。

例如:

<?php

// Connect, prepare statement, etc.

$stmt->execute();

$fields = $stmt->result_metadata();
$fields = $fields->fetch_fields();

foreach ($fields as $field) {
    // Unnecessary creation of an array.
    $params[] = &$row[$field->name];
}

call_user_func_array(array($stmt, 'bind_result'), $params);

?>

所以现在我正在创建另一个数组,只是为了让call_user_func_array通过引用传递参数,因为它不符合方法定义。

有没有办法让call_user_func_array遵守方法/函数定义?是否有一种更简洁的方法来调用具有可变数量参数的方法/函数?或者,这个问题是否只是一个整体更清洁,更好的解决方案?

我在调用bind_param时遇到类似的问题,同时试图保持能够更改绑定参数并重新运行语句的功能。

在某些方面,下面的代码到底是做什么的。

$row[$field->name] = &$row[$field->name];

它奇怪地工作并且不会产生任何错误,尽管我并没有完全了解变量如何引用自身。除了我不创建另一个数组之外,它与前者之间是否存在重大差异?它更好吗?

感谢。

修改

这就是我使用Reflection API而不是call_user_fun_array的方法。关于我使用它,性能与call_user_func_array,实现等的任何输入都将非常感激。我以前没有真正搞过它,几乎每个方法都没有记录,所以我不确定使用它们的正确方法。

<?php

foreach ($fields as $field) {
    $row[$field->name] = NULL;
}

$refMethod = new ReflectionMethod($stmt, 'bind_result');
$refMethod->invokeArgs($stmt, $row);

?>

1 个答案:

答案 0 :(得分:2)

我知道的一种方法是您可以使用 Reflection 类的isPassedByReference方法。

<强> Here is a solution i came up with after facing that issue for a framework i have had been developing.