3.3 变量与常量
顾名思义,变量就是在PHP程序执行过程中可以改变其值的量,常量就是在PHP程序执行过程中不可以改变其值的量。
变量名由一个合法的PHP字符串来表示,变量的值可以改变。常量分为内容常量和字符常量。内容常量是指其具有固定值或内容的字符串本身,比如3.14、"WindowsXP"本身就是常量,其值具有唯一确定性。字符常量是指用常量名来表示一个恒定的值。
3.3.1 定义常量
常量的使用是将程序中多处相同的内容用一个常量表示,可以简化程序和增加可读性。当定义了常量后,可以在以后的脚本语句中使用这个常量。通常在程序文件的开头部分定义常量,根据需要对其更改较为容易。
常量具有以下3个特点:
1 必须用函数define()定义。
2 定义完后其值不能再被改变。
3 使用时直接用常量名,不能像变量一样在前面加$。
例如:
PHP语言中预定义了一些常量,用户不必再去定义即可直接使用,我们称它们为系统常量。除了为数不多的内核系统常量外,很多系统常量是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现。下面列举4个系统常量。
1 FILE:PHP程序文件名
2 LINE:PHP程序文件的行数
3 PHP_VERSION:当前PHP解析器的版本号
4 PHP_OS:执行当前PHP解析器的操作系统名称
3.3.2 变量的作用范围
PHP中的变量用一个美元符号后面跟变量名来表示,变量名是区分大小写的。变量名与PHP中的其他标签一样遵循相同的规则。一个有效的变量名由字母或者下画线开头,后面跟上任意数量的字母、数字或者下画线。变量名中可以包含中文,不过不建议使用含有中文的变量名,因为在不同的网络上传输时会产生错误。
在命名变量时,应该使用易于辨认、有实质意义的字符串,比如:$name、$color等。
变量赋值有两种方式,传值赋值和引用赋值。
传值赋值是将一个表达式的值赋予一个变量。一般情况下,使用=进行传值赋值。也可以使用定界符<<<将字符串赋值给一个变量。例如:
$name="Yao Ming"; $sum=123+456; $str_ A= <<<EOD白日依山尽,\n黄河入海流。\n欲穷千里目,\n更上一层楼。EOD;
这种赋值方式将整个原始表达式的值传到目标变量。用这种方式将源变量的值赋予目标变量时,改变其中目标变量的值,将不会影响到源变量的值。源变量和目标变量在存储系统中是互相独立的,传值赋值实际上在存储系统中执行了复制操作,如图3-4所示。
图3-4 传值赋值的变量值变化示意图
引用赋值是新变量简单地引用了原始变量,换言之,新变量成为了原始变量的别名或者指向了原始变量,意味着没有执行复制操作,它们的值或内容在存储系统中位于同一位置。这样,改动新的变量将影响到原始变量,反之亦然。因而,这种赋值操作更加快速。
引用赋值使用专门的操作符&,如图3-5所示。
图3-5 引用赋值的变量值变化示意图
echo $name2; //输出显示:My name is Tom echo $name1; //输出显示:My name is Tom
只有确定名字的变量才可以引用赋值,其他情况将会发生错误。
例如:
$sum=&(123+456); //错误 function dollar() { return 7.89; } $a=&dollar(); //错误
当一个变量的值是另一个变量的变量名时,这个变量称为可变变量或动态变量。
例如:
$height=182; $tom_height="height"; echo $$tom_height; //相当于$height,显示182
变量的作用范围也就是它的生效范围,范围跨度是定义这个变量的PHP文件。包含了在PHP文件中使用include和require引入的文件。例如:
$a = 1000; include 'b.php';
这里变量$a将会在包含文件b.php中生效,可以使用。
若变量是在用户自定义函数中定义的,那么默认情况下将被限制在局部函数范围内。
例如:
$a =1000; function Test() { echo $a; //此句不会有任何输出 echo global $a; //此句会输出1000 } Test();
上述程序中用户自定义函数的第1句不会有输出,因为在Test()范围内没有定义变量$a。而第2句会输出1000,是因为在$a前加上了关键字global,使用了函数外定义的变量$a。
使用关键字global定义的变量被称为全局变量,可以在定义该变量的范围外使用。同样,可以在用户自定义函数范围内用关键字global指向函数范围外的变量使用。
例如:
function Test() { global $a=1000; } Test(); $b=$a+1000; echo $b; //$b的值等于2000 $a=123;
$b=456; function Sum() { global $a, $b; $b=$a+$b; //$b的值等于123+456,即579 } Sum(); echo $b; //显示579
全局范围内访问变量的另一个办法,是PHP预定义变量中的超全局变量$GLOBALS数组。$GLOBALS数组包含一个引用,该引用指向每个当前脚本程序的全局范围内有效的变量。该数组元素的键名为全局变量的名称。
例如:
$a=123; $b=456; function Sum() { $GLOBALS['b']=$GLOBALS['a']+$GLOBALS['b']; } Sum(); echo $b; //输出579
3.3.3 变量的生存期
变量的生存期是指变量可供使用的时间段。形象地讲,变量的生存期就是变量的“寿命”。变量在其生存期内都是有效的,超过其生存期,变量将会失效,这时变量不再存在,也就不能访问到该变量的值。
用户自定义函数在执行时所产生的变量,在函数结束时就消失了。有时因为程序的需要,当不希望变量在每次执行完函数就消失时,这种情况需要使用静态变量。定义静态变量的关键字是static。
例如:
function Test() { static $a=0; echo $a; $a++; } Test(); Test();
因为将$a定义为静态变量,所以每次调用Test()函数都会输出$a的值并加一。
全局变量的生存期仅限于定义其自身的程序文件中,当程序文件执行结束或被关闭后,全局变量也就消失了。
静态变量的作用范围和局部变量相同,而生存期和全局变量相同。
3.3.4 预定义变量
PHP提供了大量的预定义变量,也叫系统变量。许多预定义变量依赖于运行的服务器的版本和PHP配置文件的设置。
使用phpinfo()函数可以查看当前PHP环境中的系统变量及其具体值,如表3-3所示。
表3-3 PHP变量
续表