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

PHP调用参数数量可变的函数,php,reference,pass-by-reference,Php,Reference,Pass By Reference,所以我遇到了一个小问题。我知道一个解决方案,但它似乎不是很干净,我想知道是否有一个更好的 我正在编写一个MySQLi包装器来运行准备好的语句。由于它是一个包装器,并且要被重用(动态),因此返回的列的数量取决于查询,而不是静态的 我发现的一个解决方案,似乎是每个人都在使用的,就是调用用户函数数组 它是有效的,但我的问题是它让我创建了一个额外的引用数组,而我本来就不需要这些引用 例如: <?php // Connect, prepare statement, etc. $stmt->

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

我正在编写一个MySQLi包装器来运行准备好的语句。由于它是一个包装器,并且要被重用(动态),因此返回的列的数量取决于查询,而不是静态的

我发现的一个解决方案,似乎是每个人都在使用的,就是调用用户函数数组

它是有效的,但我的问题是它让我创建了一个额外的引用数组,而我本来就不需要这些引用

例如:

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

?>
它工作起来很奇怪,也不会产生任何错误,尽管我不知道变量如何引用自身。除了我没有创建另一个数组这一事实之外,它与前者有什么主要区别吗?更好吗

谢谢

编辑:

这就是我如何使用反射API而不是
call\u user\u fun\u array
。如对我的使用、性能与调用用户函数数组、实现等方面有任何意见,将不胜感激。我以前没有真正弄糟过它,几乎每种方法都没有文档记录,所以我不确定使用它们的正确方法

<?php

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

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

?>

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


谢谢你的回答。我用
ReflectionMethod
玩了一会儿,然后用它调用
bind\u result
,它看起来更干净了。我试着做了一些基准测试,但如果速度慢一点或慢一点,我真的无法得出任何结论。(很可能是我的测试方法)——我根本没有真正玩过反射类,而且大多数方法都没有文档化,所以没有多大帮助。不确定是否有比我更好的方法使用它们谢谢我仍然对其他解决方案感兴趣,如果有的话。只是想知道,哪种方法是未记录的,我在php.net/上查找了一些方法,这些方法都有记录,通常它们的名称都是自记录的(至少是用来玩的)@mathroc我更多的是指所有东西都只有参数列表可用。一般来说,我并没有弄乱反射,所以这并不是仅仅试图为我解释PHP对它的实现它用于获取关于类的信息,它的方法和参数是非常自我记录的,正如您所说的。当我试图调用方法或其他对我来说不太合适的东西时,它试图找出如何正确地使用它这真的不太难理解。我只是不确定我的实现方式是否正确。@anomareh:即使通过引用传递参数,您的新反射实现也能工作吗?如果是,并且您得到了预期的结果,那么就可以了。我个人使用isPassedByReference检查是否有任何内容是通过引用传递的,并在后面进行了验证。@Sarfraz是的,它是有效的
invokeArgs
通过引用传递<但是,代码>调用不起作用。据我所知,
isPassedByReference
只返回参数是否通过引用传递。如果函数调用不是通过引用传递的,那么它将失败,因此我真的不需要检查它是否通过引用传递<代码>绑定结果仅接受引用,否则将失败。如果您正常调用该函数,则该函数表现良好。问题是
call\u user\u func\u array
忽略方法定义并按值传递,即使方法定义为按引用传递。
<?php

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

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

?>