PHP从入门到精通(第5版)
上QQ阅读APP看书,第一时间看更新

3.5 PHP变量

变量是指在程序执行过程中数值可以变化的量。变量通过一个名字(变量名)来标识。系统为程序中的每一个变量分配一个存储单元,变量名实质上就是计算机内存单元的命名。因此,借助变量名即可访问内存中的数据。

3.5.1 变量声明及使用

和很多语言不同,在PHP中使用变量之前不需要声明变量(PHP 4之前需要声明变量),只需为变量赋值即可。PHP中的变量名称用$和标识符表示。标识符由字母、数字或下画线组成,并且不能以数字开头。另外,变量名是区分大小写的。

变量赋值是指给变量一个具体的数据值,对于字符串和数字类型的变量,可以通过“=”来实现。格式为:

    <?php $name = value; ?>

对变量赋值时,要遵循变量命名规则。如下面的变量命名是合法的:

    <?php
       $thisCup="oink";
       $_Class="roof ";
    ?>

下面的变量命名则是非法的:

    <?php
       $11112_var=11112;      //变量名不能以数字字符开头
       $@spcn = "spcn";       //变量名不能以其他字符开头
    ?>

除了直接赋值外,还有两种方式可为变量声明或赋值,一种是变量间的赋值。

【例3.11】变量间的赋值是指赋值后两个变量使用各自的内存,互不干扰。实例代码如下:(实例位置:资源包\TM\sl\3\11

    <?php
       $string1 = "mingribook";  //声明变量$string1
       $string2 = $string1;      //使用$string1初始化$string2
       $string1 = "mrbccd";      //改变变量$string1的值
       echo $string2;            //输出变量$string2的值
    ?>

结果为:mingribook

另一种是引用赋值。从PHP 4开始,PHP引入了“引用赋值”的概念。引用的概念是,用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。使用&符号来表示引用。

【例3.12】在本例中,变量$j是变量$i的引用,当给变量$i赋值后,$j的值也会跟着发生变化。实例代码如下:(实例位置:资源包\TM\sl\3\12

    <?php
       $i = "mingribook";  //声明变量$i
       $j = & $i;          //使用引用赋值,这时$j已经赋值为mingribook
       $i = "mrbccd";      //重新给$i赋值
       echo $j;            //输出变量$j
       echo "<br>";
       echo $i;            //输出变量$i
    ?>

结果为:mrbccd

mrbccd

注意

引用和复制的区别在于:复制是将原变量内容复制下来,开辟一个新的内存空间来保存,而引用则是给变量的内容再起一个名字。可以这样理解,一些文学爱好者经常会向报纸、杂志投稿,但一般不会用真名,而是笔名,这个笔名就可以看作是一个引用。

3.5.2 变量作用域

在使用变量时,要符合变量的定义规则。变量必须在有效范围内使用,如果变量超出有效范围,则变量也就失去其意义了。变量的作用域如表3.9所示。

表3.9 变量的作用域

在函数内部定义的变量,其作用域为所在函数,如果在函数外赋值,将被认为是完全不同的另一个变量。在退出声明变量的函数时,该变量及相应的值就会被清除。

【例3.13】本例用于比较在函数内赋值的变量(局部变量)和在函数外赋值的变量(全局变量),实例代码如下:(实例位置:资源包\TM\sl\3\13

    <?php
       $example="在……函数外";                        //声明全局变量
       function example(){
          $example="……在函数内……";                 //声明局部变量
          echo "在函数内输出的内容是:$example.<br>";  //输出局部变量
       }
       example();                                      //调用函数,输出变量值
       echo "在函数外输出的内容是:$example.<br>";     //输出全局变量
    ?>

运行结果如图3.9所示。

图3.9 局部变量的使用

静态变量在很多地方都能用到。例如,在博客中使用静态变量记录浏览者的人数,每一次用户访问和离开时,都能够保留目前浏览者的人数。在聊天室中也可以用静态变量来记录用户的聊天内容。

【例3.14】下面使用静态变量和普通变量同时输出一个数据,查看一下两者的功能有什么不同。实例代码如下:(实例位置:资源包\TM\sl\3\14

    <?php
      function zdy (){
         static $message = 0 ;               //初始化静态变量
         $message+=1;                        //静态变量加1
         echo $message." " ;  }              //输出静态变量
      function zdy1(){
         $message = 0 ;                      //声明函数内部变量(局部变量)
         $message += 1 ;                     //局部变量加1
         echo $message." " ;  }              //输出局部变量
      for ( $i=0 ; $i<10 ; $i++ )   zdy() ;  //输出1~10
      echo "<br>";
      for ($i=0 ; $i<10 ; $i++ )   zdy1() ;  //输出10个1
      echo "<br>";
    ?>

运行结果如图3.10所示。

图3.10 比较静态变量和普通变量的区别

自定义函数zdy()是输出从1~10共10个数字,而zdy1()函数输出的是10个1。自定义函数zdy()含有静态变量,而函数zdy1()是一个普通变量。初始化都为0,再分别使用for循环调用两个函数,结果是静态变量的函数zdy()在被调用后保留了$message中的值,而静态变量的初始化只是在第一次遇到时被执行,以后就不再对其进行初始化操作了,将会略过第3行代码不执行;而普通变量的函数zdy1()在被调用后,其变量$message失去原来的值,重新被初始化为0。

全局变量可以在程序中的任何地方访问,但是在用户自定义函数内部是不可用的。想在用户自定义函数内部使用全局变量,要使用global关键字声明。

【例3.15】在自定义函数中输出局部变量和全局变量的值。实例代码如下:(实例位置:资源包\TM\sl\3\15

    <?php
    $hr = "黄蓉";         //声明全局变量$hr
    function lxt(){
        $gj = "郭靖";     //声明局部变量$gj
        echo $gj."<br>";  //输出局部变量的值
        global $hr;       //利用关键字global在函数内部定义全局变量
        echo $hr."<br>";  //输出全局变量的值
    }
    lxt();
    ?>

结果为:郭靖

黄蓉

3.5.3 可变变量

可变变量是一种独特的变量,它允许动态改变一个变量名称。其工作原理是该变量的名称由另外一个变量的值来确定,实现过程就是在变量的前面再多加一个美元符号“$”。

【例3.16】下面使用可变变量动态改变变量的名称。首先定义两个变量$a和$b,并且输出变量$a的值,然后使用可变变量来改变变量$a的名称,最后输出改变名称后的变量值,实例代码如下:(实例位置:资源包\TM\sl\3\16

    <?php
       $a = "b";          //声明变量$a
       $b = "我喜欢PHP";  //声明变量$b
       echo $a ;          //输出变量$a
       echo "<br>" ;
       echo $$a ;         //通过可变变量输出$b的值
    ?>

结果为:b

我喜欢PHP

3.5.4 PHP预定义变量

PHP提供了很多非常实用的预定义变量,通过这些预定义变量可以获取用户会话、用户操作系统的环境和本地操作系统的环境等信息。常用的预定义变量如表3.10所示。

表3.10 预定义变量