从零开始学PHP
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 变量和常量

变量和常量是计算机编程中的一个重要概念,变量或常量可以理解为,是程序给一些数据取的名字。编程时,因为一些数据随着程序的运行而改变,所以不能直接使用这些数据,需要用变量来存储,例如一个篮子里面放了5个苹果,每天吃一个,那么篮子里面的苹果每天都会减少,这就不能直接使用5,而需要给这个数据取个名字,这样数据变化时,不需要重新修改程序。常量和变量不同的地方是,常量在程序运行过程中不能改变其值,而变量可以在程序运行过程中不断改变其值。

简而言之,编程使用变量和常量来表示程序所需的任何信息。

4.1 从类型到变量

在PHP中,变量的类型是可以任意转换的,变量定义时不需要明确的类型定义。变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个字符串值赋给变量var,那么var就成了一个字符串。如果又把一个整型值赋给var,那var就成了一个整数。

当然,这也不是绝对的,PHP有两种类型转换方式可改变变量的类型,一种是自动转换,一种是强制转换。首先看一下自动类型转换,运行Zend Studio,打开项目php,新建文件“type_juggling.php”,并输入代码4-1。

代码4-1 自动类型转换例子type_juggling.php

        <?php
        $foo = "0";
        $foo += 2;
        $foo = $foo + 1.3;
        $foo = 5 + "10 Little Piggies";
        $foo = 5 + "10 Small Pigs";
        ?>

保存代码,按“F5”键运行,结果如图4.1所示。

代码分析:第3行定义变量$foo,并赋值0(零),并用双引号括起来,恐怕很多人会认为输出结果中此变量应该是整型,但实际结果却是string(字符串),这是因为给一个变量赋值时,如果用引号括起来,PHP会认为这是赋的字符串值,此变量的类型也就是字符串型了。第6行变量$foo自身加2,这里的2没有引号,结果显示变量$foo的类型为int(整型),值为2,这说明当整型和字符串做相加运算后,结果为整型。第9行同理,浮点型和字符串做相加运算后,结果为浮点型。第12行比较特殊,结果为整数15,这是因为当一个字符串被当做数字来求值时,该值由字符串最前面的部分决定,如果字符串以合法的数字开始,则用该数字作为其值,否则其值为0 (零),合法数字由可选的正负号开始,后面跟着一个或多个数字(包括十进制数),后面跟着可选的指数,指数是一个“e”或者“E”后面跟着一个或多个数字,本行的字符串以10开头,就将10作为其值与整数5相加,所以结果为15。另外,如果此字符串包括“.”,“e”或“E”任何一个字符,字符串被当做float来求值,反之被当做整型。

图4.1 自动类型转换

再看强制转换,新建文件“type_casting.php”,并输入代码4-2。

代码4-2 强制转换例子type_casting.php

        <?php
        $foo = 10;
        var_dump($foo);
        $bar = (boolean) $foo;
        var_dump($bar);
        ?>

保存代码,按“F5”键运行,结果如图4.2所示。

图4.2 强制类型转换

代码分析:第3行定义变量$foo,并赋值,第4行打印变量$foo的类型为int(整型),值为10,第6行定义变量$bar,并将变量$foo强制转换成布尔型的值赋予$bar,打印结果为变量$bar的类型为布尔型,值为真。

PHP的强制转换类型,是在要转换的变量之前加上用括号括起来的目标类型。允许的强制转换有:

● (int),(integer):转换成整型。

● (bool),(boolean):转换成布尔型。

● (float),(double),(real);转换成浮点型。

● (string) - 转换成字符串。

● (array) - 转换成数组。

● (object) - 转换成对象。

4.2 变量的命名

PHP中的变量用一个美元符号后面跟变量名来表示,且变量名区分大小写。变量名与PHP中其他标识符遵循相同规则。一个有效的变量名由字母或者下画线开头,后面跟上任意数量的字母、数字或者下画线。下面是一个有效变量名的演示,运行Zend Studio,打开项目php,新建文件“var.php”,并输入代码4-3。

代码4-3 有效变量名例子var.php

        <?php
        $var = 'fool';
        $var1 = 'kaka';
        $_var2 = 'is';
        $龙洋 = 'longyang';
        var_dump($var, $var1, $_var2, $龙洋);
        ?>

保存代码,按“F5”键运行,结果显示如图4.3所示。

图4.3 变量命名

结果运行正常,说明变量命名正确。

4.3 可变变量

可变变量是指一个变量的变量名可以动态地设置和使用。一个可变变量获取了一个普通变量的值作为其变量名,这个变量就叫可变变量。

下面是可变变量的演示。运行Zend Studio,打开项目php,新建文件“var_var.php”,并输入代码4-4。

代码4-4 可变变量例子var_var.php

        <?php
        $a = 'hello';
        $$a = 'world';
        var_dump($$a);
        echo "$$a";
        ?>

保存代码,按“F5”键运行,结果如图4.4所示。

图4.4 可变变量

代码分析:第3行定义变量$a,并赋值为“hello”,第4行定义变量$$a,并赋值为“world”,因为第3行已经给变量$a赋值为“hello”,所以可变变量$$a的值是$hello。

注意 在PHP的函数和类的方法中,超全局变量不能用做可变变量。

4.4 预定义变量

预定义变量是指PHP预先定义好的变量,不需要赋值,就可直接用。用Zend Studio做一个演示,运行Zend Studio,打开项目php,新建文件“predefined_var.php”,并输入以下代码4-5。

代码4-5 预定义变量例子predefined_var.php

        <?php
        var_dump($_COOKIE, $_ENV, $_FILES, $_GET, $GLOBALS, $_POST, $_REQUEST, $_SERVER, $_SESSION);
        ?>

图4.5 预定义变量

保存代码,按“F5”键运行,Debug Output区域输出结果如图4.5所示。

以上代码中所列的变量就是PHP的预定义变量,分别解释如下。

● $_SERVER:服务器变量,包含头信息(header)、路径(path)和脚本位置等组成的数组。

● $_ENV:环境变量,包含操作系统类型、软件版本等信息组成的数组。

● $_COOKIE:HTTP Cookies变量,通过HTTP cookies传递的变量组成的数组。

● $_GET:HTTP GET变量,通过HTTP GET方法传递的变量组成的数组。

● $_POST:HTTP POST变量,通过HTTP POST方法传递的已上传文件项目组成的数组。

● $_FILES:HTTP文件上传变量,通过HTTP POST方法传递的已上传文件项目组成的数组。

● $_REQUEST:Request变量,此关联数组包含 $_GET、$_POST和$_COOKIE中的全部内容。

● $_SESSION:Session变量,包含当前脚本中session变量的数组。

● $GLOBALS:全局变量,由所有已定义全局变量组成的数组。

注意 预定义变量的变量名就是所在数组的索引。其值会因系统环境的不同而不同,甚至可能 不存在。数组将在后面的章节中学习,在这里可以把数组理解为一组数据的集合。

4.5 外部变量

在1.2.6节中学习了用HTML创建表单,当一个表单体交给PHP脚本时,表单中的信息会自动在PHP脚本中可用,这是PHP的外部变量之一。

以下是外部变量的演示。运行Zend Studio,打开项目php,新建文件“outside_var.php”,并输入代码4-6。

代码4-6 外部变量例子outside_var.php

        <?php
        var_dump($_POST['username']);
        var_dump($_REQUEST['username']);
        var_dump($_POST['email']);
        var_dump($_REQUEST['email']);
        ?>
        <form action="outside_var.php" method="POST">
            你的名字:  <input type="text" name="username"><br />
            你的邮件: <input type="text" name="email"><br />
            <input type="submit" name="submit" value="提交" />
        </form>

保存代码,然后单击Zend Studio编辑器区域的“Browser”按钮,并在地址栏输入地址“http://localhost/lesson1/outside_var.php”,按“Enter”键,结果如图4.6所示。

图4.6 表单外部变量

在“你的名字”文本框中输入自己的名字,在“你的邮件”文本框中输入自己的电子邮件,单击“提交”按钮,结果如图4.7所示。

图4.7 表单提交结果

代码分析:第3、4、5、6行代码分别打印了4个未定义的变量,PHP代码后面是HTML创建的表单,表单名分别为“name”和“email”,单击“提交”按钮,服务器接受到表单传来的值后,自动转换为PHP预定义变量$_POST的数组元素,要访问这些元素,直接把表单的字段名当成$_POST数组的索引就可以了,所以代码里面可以看到,打印的$_POST[‘name’]结果是表单字段名为“name”的文本框“你的名字”中输入的值。

除了表单提交的外部变量外,HTTP Cookies也是外部变量,Cookies处理将在后面的章节中详细介绍,这里不做说明。

4.6 引用

对于“引用”,PHP手册比喻为UNIX系统的文件名和文件本身,即变量名是目录条目,而变量内容则是文件本身。引用可以被看做UNIX系统文件系统中的hardlink。如果这个比喻不好理解,那么可以比喻为,Windows系统的快捷方式和文件本身。

举一个例子,运行Zend Studio,打开项目php,新建文件“references.php”,并输入代码4-7。

代码4-7 引用例子references.php

        <?php
        $a = 'abc';
        $b =& $a;
        $c = $a;
        var_dump($a, $b, $c);
        $a = 'def';
        var_dump($a, $b, $c);
        ?>

保存代码,按“F5”键运行,结果如图4.8所示。

图4.8 引用

代码分析:第3行定义变量$a,并赋值abc,第4行定义变量$b,并赋值为$a,第5行定义变量$c,并引用赋值为$a。这里可以看到,变量引用就是在被引用变量前面加“&”符号。第7行打印3个变量的值,输出结果全部为“abc”,可见3个变量都是一样的。关键的第8行做了一个改动,将变量$a的值从“abc”改为了“def”,第9行再次打印3个变量的时候发生了意想不到的事情,变量$a输出“def”肯定没问题,变量$b输出“abc”也没问题,因为变量$b在第4行的时候被赋值为当时变量$a的内容,然后就一直没有改变其值,显然结果为“abc”,奇怪的是变量$c也没有改变其值,输出结果却是和重新赋值的变量$a内容一样,这就是引用的作用,好比快捷方式和快捷方式所指向的文件,变量$c就是变量$a的快捷方式,如果变量$a的值发生改变,那么变量$c也会跟着改变,而变量$b是变量$a的拷贝,也就是说$a已经复制了一份,这样即使变量$a的值发生改变,也不会影响到变量$b。

引用的好处是节约系统内存资源,这点和建立文件的快捷方式一样,比如人们使用计算机的时候,喜欢在桌面上建立快捷方式,而不需要复制文件到桌面上,快捷方式不会占用磁盘空间。

4.7 变量的销毁

在PHP中,变量通常不需要专门销毁,系统会自动释放,但对于性能要求高的系统来说,系统自动释放太慢,达不到高性能的要求,这就要求编写代码时要及时销毁一些变量,通常是销毁一些包含大量数据的变量。

通常,销毁一个变量有两种方法:一种是重新赋值,一种是使用函数unset()。下面是一个例子,运行Zend Studio,打开项目php,新建文件“unset_var.php”,并输入以下代码4-8。

代码4-8 变量的销毁例子unset_var.php

        <?php
        $a = 'abc';
        $a = NULL;
        $b = 'def';
        unset($b);
        var_dump($a, $b);
        ?>

保存代码,按“F5”键运行,结果如图4.9所示。

图4.9 销毁变量

代码分析:第3行定义变量$a,并赋值“abc”,第4行重新给变量赋值为NULL(在类型中已经说到,NULL就是没有,如果忘了可以复习第3章),这样就销毁了变量$a,第5行定义变量$b,并赋值为“def”,第6行使用unset()函数销毁变量$b,第8行打印变量$a和变量$b,结果都为NULL,这说明变量已经被销毁。

4.8 常量

常量在程序运行期间不改变其值,并且常量是全局的,定义了一个常量,不用管作用域就可以在脚本的任何地方访问常量。

4.8.1 常量的定义

常量是使用define()函数来定义的,且一个常量一旦被定义,就不能再改变或者取消定义。常量名和其他任何PHP标签遵循同样的命名规则。合法的常量名以字母或下画线开始(常量没有美元符号),后面跟着任何字母、数字或下画线,且按惯例来说常量名全部用大写字母。常量数据包含布尔型、整型、浮点型和字符串,不能定义资源类型的常量。

常量和变量的区别有以下几点。

● 常量前面没有美元符号($)。

● 常量只能用define() 函数定义,而不能通过赋值语句。

● 常量可以不用理会变量范围的规则而在任何地方定义和访问。

● 常量一旦定义就不能被重新定义或者取消定义。

● 常量的值只能是标量。

下面是一个定义常量的例子,运行Zend Studio,打开项目php,新建文件“constant.php”,并输入以下代码4-9。

代码4-9 定义常量例子constant.phpp

        <?php
        define("CONSTANT", "Hello world");
        var_dump(CONSTANT, Constant);
        ?>

保存代码,按“F5”键运行,结果如图4.10所示。

图4.10 定义常量

代码分析:第3行定义常量CONSTANT,值为“Hello world”,第4行打印了一个CONSTANT和一个Constant来区别大小写,结果是CONSTANT的打印值是正确的,而Constant的值是其本身。

4.8.2 魔术常量

在说魔术常量前,先对PHP的预定义常量做一个说明。PHP除了有预定义变量,还有比预定义变量更多的预定义常量。这些预定义常量很多都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

PHP有5个魔术常量根据其使用的位置而改变。例如__LINE__的值就由其在脚本中所处的行来决定。这些特殊的常量不区分大小写,如表4.1所示。

表4.1 魔术常量

4.9 小结

本章的内容非常简单,从概念上来说,只介绍了常量和变量,但它们确实是最基础的PHP语法,如果连什么是变量什么是常量都分不清楚,那么对于后面的大段大段的代码,读者根本就理不清思路,不知道数值到底计算结果如何。本章是PHP学习的基础,读者一定要仔细阅读并掌握。

4.10 习题

一、填空题

1.变量必须以________符号开头,第二个字符必须是________或________。

2.销毁一个变量有两种方法:一种是________,一种是_____________。

二、选择题

1.下面程序的运行结果是( )。

        <?php
        $a=5;
        $b=3;
        echo $a/$b%$b."<br>";
        ?>

A.1

B.0

C.1.7

D.无输出