方式一:传值赋值
变量总是传值赋值。当将一个表达式的值赋予一个变量时,整个原始表达式的值就被赋值到目标变量(如: $foo = 'Bob'; $bar = $foo),当一个变量的值赋予另一个变量时,改变其中一个变量的值,将不会影响到另外一个变量 。
示例:
<!-- lang: php -->
<?php
<!-- lang: php -->
$foo = 'Bob'
<!-- lang: php -->
$bar = $foo; //传值赋值
<!-- lang: php -->
echo $foo; //输出 Bob
<!-- lang: php -->
echo $bar; //输出 Bob
<!-- lang: php -->
$foo = 'Tom'; //改变$foo的值
<!-- lang: php -->
echo $foo; //输出 Tom
<!-- lang: php -->
echo $bar; //输出Bob
<!-- lang: php -->
?>
方式二:引用赋值
引用赋值意味着新的变量简单地引用(换言之”成为其别名“或者”指向“)了原始变量。改动新的变量将影响到原始变量,反之亦然。这同样意味着其中没有执行复制操作,因而这种赋值操作更加快速。不过只有在密集的循环中或者对很大的数组或对象赋值时才有可能注意到速度的提升。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)
示例:
<!-- lang: php -->
<?php
<!-- lang: php -->
$foo = "Bob" //将字符串"Bob"赋值给变量$foo
<!-- lang: php -->
$bar = &$foo; //将变量$foo引用赋值给变量$bar
<!-- lang: php -->
<!-- lang: php -->
$bar = "Tom"; //改变变量$bar的值
<!-- lang: php -->
echo $bar; //输出 Tom
<!-- lang: php -->
echo $foo; //输出 Tom
<!-- lang: php -->
<!-- lang: php -->
$foo = "Mary"; //改变变量$foo的值
<!-- lang: php -->
echo $foo; //输出 Mary
<!-- lang: php -->
echo $bar; //输出 Mary
<!-- lang: php -->
?>
注意问题:
(1)只有有名字的变量才可以引用赋值
(2)PHP的引用并不是像C语音中的地址指针。例如,在表达式$bar = &$foo中,不会导致$bar和$foo在内存上同体,只是把各自的值相关联起来。基于这一点,使用unset()则不会导致所有引用变量消失。
示例:
<!-- lang: php -->
<?php
<!-- lang: php -->
$foo = 25;
<!-- lang: php -->
$bar = &$foo; //这是一个有效的引用赋值
<!-- lang: php -->
$bar = &(24 * 7); //此引用赋值无效,不能将表达式作为引用赋值
<!-- lang: php -->
<!-- lang: php -->
function test(){
<!-- lang: php -->
return 25;
<!-- lang: php -->
}
<!-- lang: php -->
<!-- lang: php -->
$bar = &test(); //此引用赋值也无效,也是没有名字的变量;
<!-- lang: php -->
<!-- lang: php -->
$foo = test();
<!-- lang: php -->
$bar = &$foo; //这是一个有效的引用赋值
<!-- lang: php -->
unset($foo);
<!-- lang: php -->
echo $bar; //输出 25,
<!-- lang: php -->
//说明执行unset后,$bar和$foo仅仅是相互取消值关联,$bar并没有因为$foo的释放而消失。
<!-- lang: php -->
?>