3.4 变量
变量像一个贴有名字标签的空盒子。不同的变量类型对应不同种类的数据,就像不同种类的东西要放入不同种类的盒子。
3.4.1 PHP中的变量声明
PHP中的变量不同于C或Java语言,因为PHP是弱类型的语言。在C或Java中,需要对每一个变量声明类型,但是在PHP中不需要这样做。
PHP中的变量一般以“$”作为前缀,然后以字母a~z的大小写或者“_”(下画线)开头。这是变量的一般表示方法。
合法的变量名可以是:
$hello $Aform1 $_formhandler (类似我们见过的$_POST等)
非法的变量名如:
$168 $!like
PHP中不需要显式地声明变量,但是定义变量前进行声明并带有注释是一个好的程序员应该养成的习惯。PHP的赋值有两种,即传值和引用,区别如下:
(1)传值赋值:使用“=”直接将赋值表达式的值赋给另一个变量。
(2)引用赋值:将赋值表达式内存空间的引用赋给另一个变量。需要在“=”左、右的变量前面加上一个“&”符号。在使用引用赋值的时候,两个变量将会指向内存中同一个存储空间,所以任意一个变量的变化都会引起另一个变量的变化。
【例3.3】(实例文件:源文件\ch03\3.3.php)
本程序的运行结果如图3-3所示。
图3-3 程序的运行结果
3.4.2 可变变量与变量的引用
一般的变量很容易理解,但是有两个概念比较容易混淆,就是可变变量和变量的引用。
可变变量是一种特殊的变量,允许动态改变一个变量名称。它的工作原理是该变量的名称由另一个变量的值来确定,实现过程就是在变量的前面再多加一个美元符号“$”。
在一个变量前加上“&”,然后赋值给另一个变量,这就是变量的引用赋值。
通过下面的例子对它们进行说明。
【例3.4】(实例文件:源文件\ch03\3.4.php)
本程序的运行结果如图3-4所示。
图3-4 程序的运行结果
【案例分析】
(1)在代码的第一部分,$aa被赋值bb。若$aa相当于bb,则$$aa相当于$bb。所以当$$aa被赋值为“征蓬出汉塞,归雁入胡天。”时,打印$bb就得到“征蓬出汉塞,归雁入胡天。”。反之,当$bb变量被赋值为“大漠孤烟直,长河落日圆。”时,打印$$aa同样得到“大漠孤烟直,长河落日圆。”。这就是可变变量。
(2)在代码的第二部分里,$a被赋值100,然后通过“&”引用变量$a并赋值给$b。这一步的实质是,给变量$a添加了一个别名$b。所以打印时,$a和$b都得出原始的赋值100。由于$b是别名,和$a指的是同一个变量,因此当$b被赋值300后,$a和$b都得到新值300。
(3)可变变量其实是允许改变一个变量的变量名,使用一个变量的值作为另一个变量的名。
(4)变量引用相当于给变量添加了一个别名,使用“&”来引用变量。其实两个变量名指的是同一个变量。就像是给同一个盒子贴了两个名字标签,两个名字标签指的是同一个盒子。
3.4.3 变量作用域
所谓变量作用域(Scope),是指特定变量在代码中可以被访问到的位置。在PHP中有6种基本的变量作用域法则。
(1)内置超全局变量(Built-in Superglobal Variable),在代码中的任意位置都可以访问到。
(2)常数(Constant),一旦声明,就是全局性的,可以在函数内外使用。
(3)全局变量(Global Variable),在代码间声明,可在代码间访问,但是不能在函数内访问。
(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)
本程序的运行结果如图3-5所示。
图3-5 程序的运行结果
出现上述结果是因为函数无法访问外部全局变量,但是在代码间可以访问全局变量。
如果想让函数访问某个全局变量,可以在函数中通过global关键字来声明,就是要告诉函数,它要调用的变量是一个已经存在或者即将创建的同名全局变量,而不是默认的本地变量。
通过下面的实例介绍global关键字的使用方法和技巧。
【例3.6】(实例文件:源文件\ch03\3.6.php)
本程序的运行结果如图3-6所示。
图3-6 程序的运行结果
注意:在PHP 7中,global关键字现在只能引用简单变量,例如:
另外,还可以通过“超全局变量”中的$GLOBALS数组进行访问。
下面通过实例介绍$GLOBALS数组。
【例3.7】(实例文件:源文件\ch03\3.7.php)
本程序的运行结果如图3-7所示。
图3-7 程序的运行结果
从结果可以看出,上述两种方法都可以实现在函数内访问全局变量。
3.静态变量
静态变量只是在函数内存在,在函数外无法访问,但是执行后其值保留。也就是说,一次执行完毕后,静态变量的值保留,下一次再执行此函数,这个值还可以调用。
通过下面的实例介绍静态变量的使用方法和技巧。
【例3.8】(实例文件:源文件\ch03\3.8.php)
本程序的运行结果如图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)
本程序的运行结果如图3-9所示。
图3-9 程序的运行结果