在php中的变量和函数名前加&符号的意思:
在PHP中&符号即传的是变量的引用而不是拷贝,引用意味着用不同的名字访问同一个变量内容.这并不像 C 的指针,它们是符号表别名.注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字.最接近的比喻是 Unix 的文件名和文件本身 - 变量名是目录条目,而变量内容则是文件本身.引用可以被看作是 Unix 文件系统中的紧密连接.
PHP 的引用允许你用两个变量来指向同一个内容.意思是,当你这样做时:
<?php
$a =&$b
?>
这意味着 $a 和 $b 指向了同一个变量.
注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方.
同样的语法可以用在函数中,它返回引用,以及用在 new 运算符中(PHP 4.0.4 以及以后版本):
<?php
$bar =& new fooclass();
$foo =& find_var ($bar);
?>
注: 不用 & 运算符导致对象生成了一个拷贝.如果你在类中用 $this,它将作用于该类当前的实例.没有用 & 的赋值将拷贝这个实例(例如对象)并且 $this 将作用于这个拷贝上,这并不总是想要的结果.由于性能和内存消耗的问题,通常你只想工作在一个实例上面.
尽管你可以用 @ 运算符来关闭构造函数中的任何错误信息,例如用 @new,但用 &new 语句时这不起效果.这是 Zend 引擎的一个限制并且会导致一个解析错误.
引用做的第二件事是用引用传递变量.这是通过在函数内建立一个本地变量并且该变量在呼叫范围内引用了同一个内容来实现的.例如:
<?php
function foo (&$var) {
$var++;
}
$a=5;
foo ($a);
?>
将使 $a 变成 6.这是因为在 foo 函数中变量 $var 指向了和 $a 指向的同一个内容.更多详细解释见引用传递.
引用做的第三件事是引用返回.
引用不是什么
如前所述,引用不是指针.这意味着下面的结构不会产生你预期的效果:
<?php
function foo (&$var){
$var =& $GLOBALS[“baz”];
}
foo($bar);
?>
这将使 foo 函数中的 $var 变量在函数调用时和 $bar 绑定在一起,但接着又被重新绑定到了 $GLOBALS[“baz”] 上面.不可能通过引用机制将 $bar 在函数调用范围内绑定到别的变量上面,因为在函数 foo 中并没有变量 $bar(它被表示为 $var,但是 $var 只有变量内容而没有调用符号表中的名字到值的绑定).
引用传递
你可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值.语法如下:
<?php
function foo (&$var) {
$var++;
}
$a=5;
foo ($a);
// $a is 6 here
?>
注意在函数调用时没有引用符号 - 只有函数定义中有.光是函数定义就足够使参数通过引用来正确传递了.
以下内容可以通过引用传递:
变量,例如 foo($a)
New 语句,例如 foo(new foobar())
从函数中返回的引用,例如:
<?php
function &bar() {
$a = 5;
return $a;
}
foo(bar());
?>
详细解释见引用返回.
发表回复