【问题标题】:PHP How to know if a variable is a reference?PHP如何知道变量是否是引用?
【发布时间】:2010-12-05 05:45:19
【问题描述】:

我想用 call_user_func_array 调用函数,但我注意到如果参数是函数定义中的引用并且是 call_user_func_array 中的简单值,则会出现以下警告: 警告:test() 的参数 1 应为参考,给定值

这是我正在尝试做的一个简单示例:

<?php
$a = 0;
$args = array($a);
function test(&$a) {
    $a++;
}
$a = 0;
call_user_func_array('test', $args);
?>

我的问题是:我如何知道一个值(在这种情况下是 $args 的第一个值)是否是引用?

【问题讨论】:

    标签: php reference


    【解决方案1】:

    不,问题是函数的第一个参数是按引用传递的(这意味着函数可以修改调用者范围内的参数)。因此,您必须传递一个变量或可分配的东西作为第一个参数。当您创建像array($a) 这样的数组时,它只是将变量$a(为0)的值复制到数组中的一个槽中。它不会以任何方式引用变量$a。然后当你调用函数时,就好像你在这样做,这是行不通的:

    test(0)
    

    如果你真的想,你可以通过引用将$a 放入数组中,但这有点棘手:

    <?php
    $a = 0;
    $args = array(&$a);
    function test(&$a) {
        $a++;
    }
    call_user_func_array('test', $args);
    ?>
    

    至于如何判断,数组元素是一个引用……这很难。您可以在数组上执行var_dump(),然后搜索“&”符号:

    > var_dump($args);
    array(1) {
      [0]=>
      &int(1)
    }
    

    【讨论】:

    • 是的,我知道代码是这样工作的。我只是想要一种方法来确保 $args 数组(可以包含任何内容,因为在我的代码中它是由另一个函数传递的)已经以这种方式创建,以避免在我调用 call_user_func_array 时出现任何错误。这就是为什么我想知道如何检查数组中的变量是否是引用。
    【解决方案2】:

    查看此 PHP 文档页面上的 cmets:

    http://php.net/manual/en/language.references.spot.php

    【讨论】:

    • 我看到的只是检查两个数组/对象/变量是否指向同一个内存区域的函数,方法是修改一个并检查另一个是否也被修改。在我的代码(不是示例,真实的代码)中,我只有参数数组,我想知道一个参数是否是引用。这样,如果回调函数需要一个引用并且数组包含一个简单的值,我可以抛出一个错误。
    • 它已经触发了一个警告,这个警告是针对开发者的。你想要什么样的错误?如果你想改变行为,你可以set a custom error handler
    猜你喜欢
    • 2015-11-27
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 2020-08-24
    • 1970-01-01
    • 2017-03-19
    • 2014-03-03
    相关资源
    最近更新 更多