PHP回调函数能否通过引用接受其参数?

7

我已经测试过以下内容,并且在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;
}

这是StackOverflow,这可以被允许吗?或者这是未记录的功能,可能会在未来消失、停止工作或导致错误?

2
谁说它没有文档?回调函数就像任何其他常规函数一样。 - blockhead
只是好奇,为什么你要使用 echo print_r($var, true); 而不是直接使用 print_r($var) - NullUserException
嗨,笨蛋 - 我找不到明确支持的文件,例如文档中说明它不支持call_user_function。NullUserException - 这只是习惯性地将print_r的输出放在单行的<div>标签之间。 - philjohn
@NullUserException,这很有趣,因为他正在使用echo print_r();如果您不放置“true”,它在数组后面会回显1,但如果您删除这个“true”并且还是echo它,它仍然与echo和true相同工作,请问有人能解释一下吗? - Centurion
1
@Vadim print_r() 可以带一个可选的布尔参数,如果设置为 true,则返回输出结果而不是直接打印在屏幕上(默认行为)。 - NullUserException
2个回答

10

是的,这是允许的。

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

然而,你的具体示例并未说明一个困难。考虑:

function inc(&$i) { $i++; }
$n = 0;
// Warning:  Parameter 1 to inc() expected to be a reference, value given:
call_user_func('inc', $n);
问题在于你将 `$n` 传递给了 `call_user_func`,而 `call_user_func` 不接受引用。所以当调用 `inc` 函数时,它不会收到引用。但这并不是 `array_filter` 的问题,因为它直接遍历数组,并可以将变量直接传递给回调函数。
虽然你可能可以使用 call-time 引用传递,但这已被弃用并从 trunk 中删除。
function inc(&$i) { $i++; }
$n = 0;
// Deprecated: Call-time pass-by-reference has been deprecated
call_user_func('inc', &$n);

因此,最好的选择是使用 call_user_func_array

function inc(&$i) { $i++; }
$n = 0;
call_user_func_array('inc', array(&$n));

这个函数将按引用传递那些设置了is_ref标志的元素,并按值传递其他元素。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接