【问题标题】:Can a PHP callback accept its parameter(s) by reference?PHP 回调可以通过引用接受其参数吗?
【发布时间】:2023-04-09 18:59:02
【问题描述】:

我已经测试了以下内容,它适用于 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:这是允许的,还是未记录的功能可能会在未来消失/停止工作/导致错误?

【问题讨论】:

  • 谁说它是无证的?回调是一个常规函数,就像任何其他函数一样。
  • 只是想知道,你为什么要做echo print_r($var, true); 而不是print_r($var)?
  • 嗨,笨蛋 - 我找不到它明确支持它的文档,文档指出它不适用于 call_user_function 例如。 NullUserException - 只是习惯将 print_r 的输出放在
    标记之间的一行中。
  • @NullUserException,这很有趣,因为就像他在使用 echo print_r();如果你不设置 true 它会在数组之后回显一个 1,但是如果你删除除了这个 true 之外还会回显它的工作方式与 echo 和 true 相同,有人可以解释一下吗?
  • @Vadim print_r() 采用可选的布尔参数,如果为真则返回输出而不是打印(默认)

标签: php arrays reference callback array-filter


【解决方案1】:

是的,这是允许的。

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

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

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这不是问题,因为它直接遍历数组,可以直接将数组中的变量传递给回调函数。

您可以使用调用时传递引用,但这已被弃用并从中继中删除:

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 标志的元素,并将通过值传递其他元素。

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签