文章教程

4.4变量

9/17/2020 9:40:31 PM 人评论 次浏览

4.4 变 量

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

4.4.1 PHP中的变量声明

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

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

合法的变量名可以是:

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

非法的变量名如:

  $168
  $!like

4.4.2 可变变量与变量的引用

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

【例4.3】(实例文件:ch04\4.3.php)

  <HTML>
  <HEAD>
      <title>系统变量</title>
  </HEAD>
  <BODY>
  <?php
    $value0 = "guest";
    $$value0 = "customer";
    echo $guest."<br />";
    $guest = "feifei";
    echo $guest."\t".$$value0."<br />";
    $value1 = "xiaoming";
    $value2 = &$value1;
    echo $value1."\t".$value2."<br />";
    $value2 = "lili";
    echo $value1."\t".$value2;
  ?>
  </BODY>
  </HTML>

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

image

图4-3 程序运行结果

【案例分析】

(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。

【讲解知识点】

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

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

4.4.3 变量作用域

所谓变量作用域,是指特定变量在代码中可以被访问到的位置。在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.全局变量

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

以下案例介绍全局变量的使用方法和技巧。

【例4.4】(实例文件:ch04\4.4.php)

  <HTML>
  <HEAD>
      <title> </title>
  </HEAD>
  <BODY>
  <?php
    $room = 20;
    function showrooms(){
        echo $room;
    }
    showrooms();
    echo $room.'间房间。';
  ?>
  </BODY>
  </HTML>

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

image

图4-4 程序运行结果

【案例分析】

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

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

以下实例介绍global关键字的方法和技巧。

【例4.5】(实例文件:ch04\4.5.php)

  <HTML>
  <HEAD>
      <title> </title>
  </HEAD>
  <BODY>
  <?php
    $room = 20;
    function showrooms(){
        global $room;
        echo $room.'间新房间。<br />';
    }
    showrooms();
    echo $room.'间房间。';
  ?>
  </BODY>
  </HTML>

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

image

图4-5 程序运行结果

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

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

【例4.6】(实例文件:ch04\4.6.php)

  <HTML>
  <HEAD>
      <TITLE> </TITLE>
  </HEAD>
  <BODY>
  <?php
    $room = 20;
    function showrooms(){
        $room = $GLOBALS['room'];
        echo $room.'间新房间。<br />';
    }
    showrooms();
    echo $room.'间房间。';
  ?>
  </BODY>
  </HTML>

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

image

图4-6 程序运行结果

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

3.静态变量

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

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

【例4.7】(实例文件:ch04\4.7.php)

  <HTML>
  <HEAD>
      <title>静态变量</title>
  </HEAD>
  <BODY>
  <?php
     $person = 20;
    function showpeople(){
        static $person = 5;
      $person++;
        echo '再增加一位, 将会有 '.$person.' 为 static 人员。<br />';
    }
    showpeople();
    echo $person.' 人员。<br />';
    showpeople();
  ?>
  </BODY>
  </HTML>

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

image

图4-7 程序运行结果

【案例分析】

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

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

教程类别