【问题标题】:How does the "&" operator work in a PHP function?“&”运算符在 PHP 函数中如何工作?
【发布时间】:2011-04-26 20:01:26
【问题描述】:

请看这段代码:

function addCounter(&$userInfoArray) {
    $userInfoArray['counter']++;
    return $userInfoArray['counter'];
}

$userInfoArray = array('id' => 'foo', 'name' => 'fooName', 'counter' => 10);
$nowCounter = addCounter($userInfoArray);

echo($userInfoArray['counter']);

这将显示 11。

但是!如果去掉函数参数中的“&”运算符,结果为10。

发生了什么事?

【问题讨论】:

  • 2个完美答案仅需3分钟!你们都是天才还是什么?或者期待我问这个问题。好惊讶!
  • 哦...我尝试用谷歌搜索,但失败了...太尴尬了..

标签: php


【解决方案1】:

& 运算符告诉 PHP 在将数组传递给函数时不要复制数组。而是将数组的引用传递给函数,因此函数会修改原始数组而不是副本。

看看这个最小的例子:

<?php
function foo($a) { $a++; }
function bar(&$a) { $a++; }

$x = 1;
foo($x);
echo "$x\n";    
bar($x);
echo "$x\n";
?>

这里的输出是:

1
2

– 对foo 的调用没有修改$x。另一方面,对bar 的调用确实如此。

【讨论】:

  • 感谢您的完美回答
  • 我知道我在这方面有点晚了 - 但感谢您提供这个非常明确的答案,没有任何问题。
【解决方案2】:

这里的&amp; 字符表示该变量是通过引用,而不是通过值。两者的区别在于,如果通过引用传递,对变量所做的任何更改也会对原始变量进行。

function do_a_thing_v ($a) {
    $a = $a + 1;
}
$x = 5;
do_a_thing_v($x);
echo $x; // echoes 5

function do_a_thing_r (&$a) {
    $a = $a + 1;
}
$x = 5;
do_a_thing_v($x);
echo $x; // echoes 6

【讨论】:

  • 感谢您的完美回答
【解决方案3】:

在函数调用中在变量之前使用与号时,它与原始变量本身相关联。这样,您发布的代码就是说它将向原始数组的计数器添加 1。如果没有 & 符号,它会获取数据的副本并将其添加到其中,然后返回新的计数器 11。旧数组仍然保持不变,为 10,返回的新计数器变量变为 11。

http://www.phpreferencebook.com/samples/php-pass-by-reference/

就是一个很好的例子。

【讨论】:

    【解决方案4】:

    也许我可以在其他答案中补充一点,如果它是一个对象,那么它不是“作为值传递的对象”,而是“对象的引用作为值传递”(尽管我在问什么区别在于 cmets 中的“对象通过引用传递”与“对象的引用通过值传递”之间。数组默认传值。

    信息:Objects and references

    例子:

    class Foo {
        public $a = 10;
    }
    
    function add($obj) {
        $obj->a++;
    }
    
    $foo = new Foo();
    echo $foo->a, "\n";
    
    add($foo);
    echo $foo->a, "\n";
    

    结果:

    $ php try.php
    10
    11
    

    【讨论】:

    • 谢谢另一位天才先生。
    • 这是一个常见的错误。对象通过引用传递。相反,它们的引用是按值传递的。这是一个关键的区别!尝试修改引用本身,而不是实例成员(即在方法中写入$obj = new Foo())。具有讽刺意味的是,您链接的页面甚至您的报价不真实!所以你一定知道你写的东西是假的。
    • 如果是通过引用传递,vs如果它的引用是通过值传递,如果$obj = new Foo()在方法内部,结果是一样的吗?即当再打印一次时,它仍然是11
    • 既然是单独的项目,不如在stackoverflow.com/questions/3957801/…讨论一下
    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2014-09-07
    • 2020-01-29
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多