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:这是允许的,还是未记录的功能可能会在将来消失/停止工作/导致错误?
是的,这是允许的.
在这方面,通过回调调用函数没什么特别之处.
但是,您的具体示例并未说明一个难点.考虑:
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)
问题是,你传递$n给call_user_func和call_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标志的元素,并将其他值传递给值.