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

3.4 变量

变量像一个贴有名字标签的空盒子。不同的变量类型对应不同种类的数据,就像不同种类的东西要放入不同种类的盒子。

3.4.1 PHP中的变量声明

PHP中的变量不同于C或Java语言,因为它是弱类型的。在C或Java中,需要对每一个变量声明类型,但是在PHP中不需要这样做。

PHP中的变量一般以“$”作为前缀,然后以字母a~z的大小写或者“_”下划线开头。这是变量的一般表示。

合法的变量名可以是:

    $hello
    $Aform1
    $_formhandler (类似我们见过的$_POST等)。

非法的变量名如:

    $168
    $! like

PHP中不需要显式地声明变量,但是定义变量前进行声明并带有注释,这是一个好的程序员应该养成的习惯。PHP的赋值有两种,即传值和引用,区别如下:

⑴ 传值赋值:使用“=”直接将赋值表达式的值赋给另一个变量。

⑵ 引用赋值:将赋值表达式内存空间的引用赋给另一个变量。需要在“=”左右的变量前面加上一个“&”符号。在使用引用赋值的时候,两个变量将会指向内存中同一个存储空间,所以任意一个变量的变化都会引起另外一个变量的变化。

【例3.3】(实例文件:ch03\3.3.php)

    <? php
    echo "使用传值方式赋值:<br/>";      // 输出 使用传值方式赋值:
    $a = "风吹草低见牛羊";
    $b = $a;                  // 将变量$a的值赋值给$b,两个变量指向不同内存空间
    echo "变量a的值为".$a."<br/>";      // 输出 变量a的值
    echo "变量b的值为".$b."<br/>";      // 输出 变量b的值
    $a = "天似穹庐,笼盖四野";     // 改变变量a的值,变量b的值不受影响
    echo "变量a的值为".$a."<br/>";      // 输出 变量a的值
    echo "变量b的值为".$b."<p>";        //输出 变量b的值
    echo "使用引用方式赋值:<br/>";     //输出  使用引用方式赋值:
    $a = "天苍苍,野茫茫";
    $b = &$a;                // 将变量$a的引用赋给$b,两个变量指向同一块内存空间
    echo "变量a的值为".$a."<br/>";    // 输出 变量a的值
    echo "变量b的值为".$b."<br/>";    // 输出 变量b的值
    $a = "敕勒川,阴山下";
    /*
    改变变量a在内存空间中存储的内容,变量b也指向该空间,b的值也发生变化
    */
    echo "变量a的值为".$a."<br/>";  // 输出 变量a的值
    echo "变量b的值为".$b."<p>";    // 输出 变量b的值
    ?>

本程序运行结果如图3-3所示。

图3-3 程序运行结果

3.4.2 可变变量与变量的引用

一般的变量表示很容易理解,但是有两个变量表示概念比较容易混淆,就是可变变量和变量的引用。通过下面的例子对它们进行说明。

【例3.4】(实例文件:ch03\3.4.php)

    <? php
      $value0 = "guest";                // 定义变量$value0并赋值
      $$value0 = "customer";            // 再次给变量赋值
      echo $guest."<br />";             // 输出变量
      $guest = "feifei";                // 定义变量$guest并赋值
      echo $guest."\t".$$value0."<br />";
      $value1 = "xiaoming";            // 定义变量$value1
      $value2 = &$value1;             // 引用变量并传递变量
      echo $value1."\t".$value2."<br />";  // 输出变量
      $value2 = "lili";
      echo $value1."\t".$value2;
    ?>

本程序运行结果如图3-4所示。

图3-4 程序运行结果

【案例分析】

(1)在代码的第一部分,$value0被赋值guest。$value0相当于guest,则$$value0相当于$guest。所以当$$value0被复制为customer时,打印$guest就得到customer。反之,当$guest变量被赋值为feifei时,打印$$value0同样得到feifei。这就是可变变量。

(2)在代码的第二部分里,$value1被赋值xiaoming,然后通过“&”引用变量$value1并赋值给$value2。而这一步的实质是,给变量$value1添加了一个别名$value2。所以打印时,大家都得出原始赋值xiaoming。由于$value2是别名,和$value1指的是同一个变量,因此当$value2被赋值lili后,$value1和$value2都得到新值lili。

(3)可变变量其实是允许改变一个变量的变量名,允许使用一个变量的值作为另外一个变量的名。

(4)变量引用相当于给变量添加了一个别名,使用“&”来引用变量。其实两个变量名指的都是同一个变量。就像是给同一个盒子贴了两个名字标签,两个名字标签指的都是同一个盒子。

3.4.3 变量作用域

所谓变量作用域(variable scope),是指特定变量在代码中可以被访问到的位置。在PHP中有6种基本的变量作用域法则。

(1)内置超全局变量(Built-in superglobal variables),在代码中的任意位置都可以访问到。

(2)常数(constants),一旦声明,就是全局性的,可以在函数内外使用。

(3)全局变量(global variables),在代码间声明,可在代码间访问,但是不能在函数内访问。

(4)在函数中声明为全局变量的变量就是同名的全局变量。

(5)在函数中创建和声明为静态变量的变量在函数外是无法访问的,但是这个静态变量的值可以保留。

(6)在函数中创建和声明的局部变量在函数外是无法访问的,并且在本函数终止时失效。

1.超全局变量

superglobal或autoglobal可以称为“超全局变量”或“自动全局变量”。这种变量的特性是,不管在程序的任何地方都可以访问到,不管是函数内还是函数外都可以访问到。而这些“超全局变量”就是由PHP预先定义好以方便使用的。

那么这些“超全局变量”或“自动全局变量”都有哪些呢?

● $GLOBALS:包含全局变量的数组。

● $_GET:包含所有通过GET方法传递给代码的变量的数组。

● $_POST:包含所有通过POST方法传递给代码的变量的数组。

● $_FILES:包含文件上传变量的数组。

● $_COOKIE:包含cookie变量的数组。

● $_SERVER:包含服务器环境变量的数组。

● $_ENV:包含环境变量的数组。

● $_REQUEST:包含用户所有输入内容的数组(包括$_GET、$_POST和$_COOKIE)。

● $_SESSION:包含会话变量的数组。

2.全局变量

全局变量其实就是在函数外声明的变量,在代码间都可以访问,但是在函数内是不能访问的。这是因为函数默认不能访问在其外部的全局变量。

通过下面的实例介绍全局变量的使用方法和技巧。

【例3.5】(实例文件:ch03\3.5.php)

    <? php
      $room = 20;               // 定义全局变量
      function showrooms(){
          echo $room;           // 函数内访问全局变量
      }
      showrooms();              // 访问全局变量
      echo $room.’间房间。';
    ?>

本程序运行结果如图3-5所示。

图3-5 程序运行结果

出现上述结果,是因为函数无法访问外部全局变量,但是在代码间可以访问全局变量。

如果想让函数访问某个全局变量,可以在函数中通过global关键字来声明,就是要告诉函数,它要调用的变量是一个已经存在或者即将创建的同名全局变量,而不是默认的本地变量。

通过下面的实例介绍global关键字的使用方法和技巧。

【例3.6】(实例文件:ch03\3.6.php)

      <? php
      $room = 20;                       // 定义全局变量
      function showrooms(){
          global $room;                 //函数内调用全局变量
          echo $room.’间新房间。<br />';
      }
      showrooms();
      echo $room.’间房间。';
    ?>

本程序运行结果如图3-6所示。

图3-6 程序运行结果

另外,读者还可以通过“超全局变量”中的$GLOBALS数组进行访问。

下面通过以下实例介绍$GLOBALS数组,具体步骤如下。

【例3.7】(实例文件:ch03\3.7.php)

    <? php
      $room = 20;                         // 定义全局变量
      function showrooms(){
          $room = $GLOBALS['room'];         // 通过$GLOBALS数组访问全局变量
          echo $room.’间新房间。<br />';
      }
      showrooms();
      echo $room.’间房间。';
    ?>

本程序运行结果如图3-7所示。

图3-7 程序运行结果

结果与上面的例子完全相同,可见这两种方法可以实现同一个效果。

3.静态变量

静态变量只是在函数内存在,在函数外无法访问。但是执行后,其值保留,也就是说这一次执行完毕后,静态变量的值保留,下一次再执行此函数,这个值还可以调用。

通过下面的实例介绍静态变量的使用方法和技巧。

【例3.8】(实例文件:ch03\3.8.php)

    <? php
      $person = 20;                       // 输出操作系统名称
      function showpeople(){
          static $person = 5;
        $person++;
          echo ’再增加一位,将会有 '.$person.' 位static人员。<br />';
      }
      showpeople();
      echo $person.' 人员。<br />';
      showpeople();
    ?>

本程序运行结果如图3-8所示。

图3-8 程序运行结果

【案例分析】:

(1)其中函数外的echo语句无法调用函数内的static $person,它调用的是$person = 20。

(2)showpeople()函数被执行两次,这个过程中static $person的运算值得以保留,并且通过$person++进行了累加。

3.4.4 变量的销毁

当用户创建一个变量时,相应地在内存中有一个空间专门用于存储该变量,该空间引用计数加1。当变量与该空间的联系被断开时,空间引用计数减1,直到引用计数为0,则成为垃圾。

PHP有自动回收垃圾的机制,用户也可以手动销毁变量,通常使用unset()函数来实现。该函数的语法格式如下:

    void unset (变量)

其中,变量类型为局部变量,则变量被销毁;如果变量类型为全局变量,则变量不会被销毁。

【例3.9】(实例文件:ch03\3.9.php)

    <? php
    function xiaohui()  {        //声明函数
        global $b;               //函数内使用global关键字声明全局变量$b
        unset ($b);              //使用unset()销毁不再使用的变量$b
    }
    $b= ’春江花月夜’;          //函数外声明全局变量
    xiaohui();            //调用函数
    echo  $b;             //查看全局变量是否发生变化
    ?>

本程序运行结果如图3-9所示。

图3-9 程序运行结果