PHP之可变变量
前言:本篇博客主要讲解PHP的可变变量的作用和用法。文章中所涉及到的例子来自http://php.net/manual/zh/language.variables.variable.php,稍有改动。
正文:
PHP中有一种变量叫做可变变量,这种变量不是一种基础类型的变量。可变变量是指一个普通变量的值可以作为另一个变量的名称被使用。这句话听起来有些抽象。我们可以通过实例来展示可变变量的定义以及实用。
1 $a = 'hello'; 2 $$a = 'world'; 3 echo $hello;
在上面这段代码中,第一行是一个普通的变量定义,变量名称为a,变量值为hello。第二行使用变量a的值,定义了一个变量,这个变量的名字叫做hello(也就是a的值),值为world。将这个变量输出之后的结果是:world。
下面看一个稍微复杂一点的例子
1 $b = array("I","am","a","student"); 2 $I = "a I"; 3 $am = "word AM"; 4 $a = "an A"; 5 $student = "a STUDENT"; 6 $var = 'b'; 7 echo ${$b[1]}; 8 echo ${$var}[1];
上面这段代码的1-6行都是在定义变量。第7行的结果为:word AM。下面我们解释第7行的结果。$b[1]的值是这个数组中的第二个元素,即 am,那么${$b[1]}也就是${am},即$am(花括号可以去掉)。那么,第7行的结果就是变量$am的值。第8行的结果为:am。下面我们解释第8行的结果。首先,服务器会解析$var的值,$var = ‘b',所以${$var}[1]为${b}[1],也就是$b[1]的值,即am。
以上两个例子都比较简单地说明了可变变量的用法。其实可变变量也可以用于PHP的面向对象中。下面的例子我们为大家解释可变变量在面向对象中的应用。
1 class foo{ 2 var $bar = 'I am bar'; 3 var $arr = array('I am A','I am B','I am C'); 4 var $r = 'I am r'; 5 } 6 7 $bar = 'bar'; 8 $baz = array('foo','bar','baz','quux'); 9 10 $myfoo = new foo(); 11 echo $myfoo->$bar."<br>"; 12 echo $myfoo->$baz[1]."<br>"; 13 14 $start = 'b'; 15 $end = 'ar'; 16 echo $myfoo->{$start.$end}."<br>"; 17 18 $arr = 'arr'; 19 echo $myfoo->$arr[1]."<br>"; 20 echo $myfoo->{$arr}[1]."<br>";
上面这段代码中定义了一个类:foo。
第11行的结果为:I am bar。因为在解析$myfoo->$bar的过程中,首先解释器会解析$bar,$bar的值为bar,那么$myfoo->$bar等同为$myfoo调用其类中的属性 $bar的值,结果为:I am bar。
第12行的结果为:I am bar。因为在解析$myfoo->$baz[1]的过程中,首先解释器会解析$baz[1],$baz[1]的值为bar,那么$myfoo->$baz[1]等同为$myfoo调用其类中属性$bar的值,结果为:I am bar。
第16行的结果为:I am bar。因为在解析$myfoo->{$start,$end}的过程中,首先解析$start和$end的值,分别为"b"和"ar",通过连接符"."连接后结果为bar,那么$myfoo->{$start,$end}的结果为$myfoo调用其类中属性$bar的值,结果为:I am bar。
第19行的结果为:I am r。因为在解析$myfoo->$arr[1]的过程中,首先解析$arr[1]的值,即为r。$myfoo->$arr[1]的值为调用其类中属性r的值,结果为:I am r。
第20行的结果为:I am B。因为在解析$myfoo->{$arr}[1]的过程中,首先解析$arr的值,为arr,然后是{$arr}[1]的值也是调用$myfoo属性$arr的第二个属性的值,结果为:I am B。