PHP在变量前⾯加是什么意思
⽐如:
<? php
$a = 'c' ;
$b = & $a ; //表⽰$b 和 $a 引⽤了同⼀个变量
$a = 'abc' ; //这⾥重置了$a
echo $b ; //将输出abc
unset( $a ); //取消引⽤
echo $b ; //这⾥仍输出 abc
$a = 'abcd' ;
echo $b ; //因为已经取消引⽤这⾥仍输出abc
?
>
$a = &$b;
看⼿册第15章:
引⽤是什么
在 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);
php实例手册?>
这将使 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());
?>
详细解释见引⽤返回。
任何其它表达式都不能通过引⽤传递,结果未定义。例如下⾯引⽤传递的例⼦是⽆效的:
<?php
function bar() // Note the missing &
{
$a = 5;
return $a;
}
foo(bar());
foo($a = 5) // 表达式,不是变量
foo(5) // 常量,不是变量
?>
这些条件是 PHP 4.0.4 以及以后版本有的。
引⽤返回
引⽤返回⽤在当你想⽤函数到引⽤应该被绑定在哪⼀个变量上⾯时。当返回引⽤时,使⽤此语法:
<?php
function &find_var ($param)
{
/* ... */
return $found_var;
}
$foo =& find_var ($bar);
$foo->x = 2;
?>
本例中 find_var 函数所返回的对象的属性将被设定(译者:指的是 $foo->x = 2; 语句),⽽不是拷贝,就和没有⽤引⽤语法⼀样。
注: 和参数传递不同,这⾥必须在两个地⽅都⽤ & 符号-来指出返回的是⼀个引⽤,⽽不是通常的⼀个拷贝,同样也指出 $foo 是作为引⽤的绑定,⽽不是通常的赋值。
取消引⽤
当你 unset ⼀个引⽤,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:
<?php
$a = 1;
$b =& $a;
unset ($a);
?>
不会 unset $b,只是 $a。
再拿这个和 Unix 的 unlink 调⽤来类⽐⼀下可能有助于理解。
引⽤定位
许多 PHP 的语法结构是通过引⽤机制实现的,所以上述有关引⽤绑定的⼀切也都适⽤于这些结构。⼀些结构,例如引⽤传递和返回,已经在上⾯提到了。其它使⽤引⽤的结构有:
global 引⽤
当⽤ global $var 声明⼀个变量时实际上建⽴了⼀个到全局变量的引⽤。也就是说和这样做是相同的:
<?php
$var =& $GLOBALS["var"];
?>
这意味着,例如,unset $var 不会 unset 全局变量。
$this
在⼀个对象的⽅法中,$this 永远是调⽤它的对象的引⽤。
转载:blog.csdn/remotesupport/article/details/5770618
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论