PHP回调可以通过引用接受其参数吗?

phi*_*ohn 7 php arrays reference callback array-filter

我已经测试了以下内容,它适用于PHP 5.2和5.3,但是,就我所见,它没有在任何地方记录,所以我正在评估它的用途.

我在一个名为isValid的类中有一个函数,它检查散列以查看给定值是否在允许值集合中.有些值有效的,但已弃用; 我想我的isValid函数将传入的值更新为当前值并返回true.

当我自己调用它时,这很好,但是,当我用作array_filter的回调时,我也想使用这个方法.

这是一个测试用例,按预期产生一个值为2,3,4,5,6的数组.

<?php
$test = array(1, 2, 3, 4, 5);
echo print_r(array_filter($test, 'maptest'), true);

function maptest(&$value)
{
$value ++;
return true;
}
Run Code Online (Sandbox Code Playgroud)

所以StackOverflow:这是允许的,还是未记录的功能可能会在将来消失/停止工作/导致错误?

Art*_*cto 9

是的,这是允许的.

在这方面,通过回调调用函数没什么特别之处.

但是,您的具体示例并未说明一个难点.考虑:

function inc(&$i) { $i++; }
$n = 0;
// Warning:  Parameter 1 to inc() expected to be a reference, value given:
call_user_func('inc', $n);
Run Code Online (Sandbox Code Playgroud)

问题是,你传递$ncall_user_funccall_user_func不被接受的参考值.因此,到时候inc调用,它将不会收到参考.这不是问题,array_filter因为它直接遍历数组并且可以直接将数组中的变量传递给回调函数.

可以使用call-time pass-by-reference,但这已被弃用并从trunk中删除:

function inc(&$i) { $i++; }
$n = 0;
// Deprecated: Call-time pass-by-reference has been deprecated
call_user_func('inc', &$n);
Run Code Online (Sandbox Code Playgroud)

所以最好的选择是使用call_user_func_array:

function inc(&$i) { $i++; }
$n = 0;
call_user_func_array('inc', array(&$n));
Run Code Online (Sandbox Code Playgroud)

此函数将通过引用传递已设置is_ref标志的元素,并将其他值传递给值.