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所示。
【案例分析】
(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所示。
【案例分析】
出现上述结果,是因为函数无法访问到外部全局变量,但是在代码间都可以访问全局变量。
如果想让函数访问某个全局变量,可以在函数中通过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所示。
另外,读者还可以通过“超全局变量”中的$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所示。
结果与上面的例子完全相同,可见这两种方法都可以实现同一个效果。
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所示。
【案例分析】
(1)其中函数外echo语句无法调用函数内static $person,它调用的是$person = 20。
(2)另外,showpeople()函数被执行两次,这个过程中static $person的运算值得以保留,并且通过$person++进行了累加。