【问题标题】:meaning of &$variable and &function? [duplicate]&$变量和&函数的含义? [复制]
【发布时间】:2012-10-11 17:19:50
【问题描述】:

可能重复:
Reference - What does this symbol mean in PHP?

&$variable是什么意思
和函数的含义,如

function &SelectLimit( $sql, $nrows=-1, $offset=-1, $inputarr=false, $secs2cache=0 )
{
    $rs =& $this->do_query( $sql, $offset, $nrows, $inputarr);
    return $rs;
} 

【问题讨论】:

标签: php


【解决方案1】:

像这样传递参数:myFunc(&$var); 意味着变量是通过引用传递的(而不是通过值传递)。因此,对函数中的变量所做的任何修改都会修改进行调用的变量。

& 放在函数名之前意味着“通过引用返回”。这有点违反直觉。如果可能的话,我会避免使用它。 What does it mean to start a PHP function with an ampersand?

注意不要将其与&=& 运算符(即completely different)混淆。

通过引用快速测试:

<?php
class myClass {
    public $var;
}

function incrementVar($a) {
    $a++;
}
function incrementVarRef(&$a) { // not deprecated
    $a++;
}
function incrementObj($obj) {
    $obj->var++;
}

$c = new myClass();
$c->var = 1;

$a = 1; incrementVar($a);    echo "test1 $a\n";
$a = 1; incrementVar(&$a);   echo "test2 $a\n"; // deprecated
$a = 1; incrementVarRef($a); echo "test3 $a\n";
        incrementObj($c);    echo "test4 $c->var\n";// notice that objects are
                                                    // always passed by reference

输出:

Deprecated: Call-time pass-by-reference has been deprecated; If you would like
to pass it by reference, modify the declaration of incrementVar(). [...]
test1 1
test2 2
test3 2
test4 2

【讨论】:

  • 不推荐使用返回引用,但在某些情况下会返回对象引用。
  • @troelskn 是的,我已经编辑了我的答案。
  • 也许还值得一提的是,通过引用传递在 php4 中被广泛使用,而在 php5 中几乎从来都不是一个好主意。
  • 很棒的解释。
【解决方案2】:

与号 - “&” - 用于指定变量的地址,而不是。我们称之为“通过引用传递”。

所以,“&$variable”是对变量的引用,而不是它的值。而"function &func(..." 告诉函数返回返回变量的reference,而不是变量的副本。

另见:

【讨论】:

  • 称它为地址,有点误导。它是对变量的引用。地址是指内存中某个位置的东西,例如一个指针。这显然不是指针。
  • @troelskn:我同意,并且大部分更新了我的答案以反映这一点。但是,我注意到,对于从未听说过引用传递或值传递的人来说,将其称为“地址”会更容易理解。虽然这可能技术上不正确,但对于新手来说,这可能是一个有益的切入点。
  • P.S.在许多语言中,通过引用传递是通过返回一个指针来完成的(如果你将它追溯到底层的 C 或汇编代码)。
  • 是的,从概念上讲,它的工作原理非常像指针,所以我想它可以用作隐喻。我只是认为重要的是要指出它 不是 指针,因为存在一些重要的区别。值得注意的是,引用没有提供任何性能优势(相反)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多