PHP的变量
1.可变变量
一个变量的变量名可以动态地设置和使用。一个普通的变量通过声明来设置,而一个可变变量获取了一个普通变量的值作为这个可变变量的变量名,如下所示:
<?php
$hi = "hello";
$$hi = "word";
echo "$hi $hello<br>"; //输出"hello world"
echo "$hi ${$hi}"; //输出"hello world"
在上面的例子中“hi”使用了两个美元符号($)以后,就可以作为一个可变变量的变量了。这时两个变量都被定义了,$hi的内容是"hello",并且$hello的内容是"world"。上面的两条输出指定都会输出"hello world".也就是说,$$hi和$hello是等价的。
2.变量的引用赋值
变量总是传值赋值。也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
PHP中提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单地引用(换言之,“成为其别名”或者“指向”)了原始变量。改动新的变量将影响原始变量,反之亦然。这同样意味着其中没有执行复制操作,因而,这种复制操作更加快速。不过只有在密集的循环中或者很大的数组或对象赋值时才有可能注意到速度的提升。使用引用赋值,简单地将一个“&”复活加到将要赋值的变量前(源变量)。例如下列代码片段所示:
<?php
$foo = "Bob";
$bar = &$foo;
$bar = "My name is Tom"; //改变变量$bar的值
echo $bar."<br>"; //变量$bar的值被改变,输出"My name is Tom"
echo $foo."<br>"; //变量$foo的值也被改变,输出"My name is Tom"
$foo = "Your name is Bob"; //改变变量$foo的值
echo $bar."<br>"; //变量$bar的值也被改变,输出"Your name is Bob"
echo $foo."<br>"; //变量$foo的值被改变,输出"Your name is Bob"
在上面的代码中,我们并不是将变量$foo的值赋值给变量$bar,而是将$foo的引用赋值给了$bar,这时,$bar相当于是$foo的别名。只要其中的任何一个有所改变,都会影响到另一个变量。有一个重要事项必须指出,那就是只有有名字的变量才可以引用赋值。如下所示:
<?php
$foo = 25;
$bar = &$foo; //这是一个有效的引用赋值
$bar = &(24 *47); //此引用赋值无效,不能将表达式作为引用赋值
function test(){
return 25;
}
$bar = &test(); //此引用赋值无效,也是没有名字的变量
另外,php的引用并不像C语言中的地址指针。例如,在表达式$bar = &$foo中,不会导致$bar和$foo在内存上同体,只是把各自的值相关联起来。基于这一点,使用unset()则不会导致所有引用变量消失。
<?php
$foo = 25;
$bar = &$foo;
unset($bar);
echo $foo; //值为25
在执行unset()后,变量$bar和$foo仅仅是互相取消值值关联,$foo并没有因为$bar的释放而消失。