《php 引用》是意味着用不同的名字访问同一个变数内容,并且允许用两个变数来指向同一个内容。这并不像 C 的指针,替代的是,引用是符号表别名。在 php 中,变数名和变数内容是不一样的,同样的内容可以有不同的名字。最接近的比喻是 Unix 的档案名称和档案本身――变数名是目录条目,而变数内容则是档案本身。引用可以被看作是 Unix 档案系统中的紧密连线。
基本介绍
- 中文名php 引用
- 外文名PVP reference
引用做什幺
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 引擎的一个限制并且会导致一个解析错误。
, 例子 21-1. 在函式内引用全局变数
<?php
$var1 = "Example variable" ;$var2 = "" ;
function global_references ( $use_globals )
{
global $var1$var2 ;
if (! $use_globals ) {
$var2 =& $var1 ; // visible only inside the function
} else {
$GLOBALS ["var2" ] =& $var1 ; // visible also in global context
}
}
global_references ( false );
echo "var2 is set to '$var2'/n " ; // var2 is set to ''
global_references(true );
echo "var2 is set to '$var2' /n " ; // var2 is set to 'Example variable'
?>
注: 如果在 foreach 语句中给一个具有引用的变数赋值,被引用的对象也被改变。 例子 21-2. 引用与 foreach 语句
<?php
$ref = 0 ;
$row =& $ref ;
foreach (array( 1 2 3 ) as $row ) {
// do something
}
echo $re ; // 3 - last element of the iterated array
?>
, 例子 21-3. 複杂数组的引用
<?php
$top = array(
'A' => array(),
'B' => array(
'B_b' => array(),
),
);
$top [ 'A' ][ 'parent' ] = &$top ;
$top [ 'B'][ 'parent'] = & $top ;
$top [ 'B' ][ 'B_b' ][ 'data' ] = 'test' ;
print_r ( $top ['A' ][ 'parent' ][ 'B']['B_b' ]); // array()
?>, ,
引用做的第二件事是用引用传递变数。这是通过在函式内建立一个本地变数并且该变数在呼叫範围内引用了同一个内容来实现的。例如 <?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 只有变数内容而没有调用符号表中的名字到值的绑定)。可以使用引用返回来引用被函式选择的变数。