
2.2 PHP数据类型
在学习一门程序语言时,首先需要学会它的数据类型。因为在程序开发中,程序操作的对象就是数据,并且每一种数据都有它的类型,具备相同类型的数据才可以互相操作。
PHP的数据类型主要分为三大类:标量数据类型、复合数据类型和特殊数据类型。
提示:变量的数据类型是根据它在文档中的使用情况决定。
2.2.1 标量数据类型

标量数据类型是数据结构中最基础的单元,只能存储一个数据。标量数据类型包括4种,即String(字符串型)、Boolean(布尔型)、Integer(整型)和Float/Double(浮点型)。
1. 字符串型
字符串是连续的字符序列,由数字、字母和符号组成。在PHP中,字符串中的每个字符只占用一个字节。有三种定义字符串的方式,单引号(')、双引号(")和定界符(<<<)。
通常使用单引号和双引号定义字符串,例如下面的代码:

两者的不同之处在于,双引号中包含的变量会自动被替换成相应的值,而单引号中包含的变量则按普通的字符串输出,具体内容将在5.6节中进行介绍。
另外,还有单引号和双引号嵌套时的不同,双引号当中包含单引号,单引号当中又包含变量时,变量会被解析,单引号会被原样输出;单引号当中包含双引号时,双引号当中又包含变量时,变量不会被解析,双引号会被原样输出。
【例2-4】(实例文件:ch02\Chap2.4.php)字符串型。

在IE浏览器中运行结果如图2-11所示。
单引号和双引号之间的另一处不同点是对转义字符的使用,双引号可以解析除单引号以外所有的转义字符,单引号只能解析“\”和本身的转义“\'”。常见的转义字符如表2-1所示。

图2-11 字符串型
表2-1 常见的转义字符

【例2-5】(实例文件:ch02\Chap2.5.php)单引号和双引号中转义字符的区别。

在IE浏览器中运行结果如图2-12所示。
注意:在不同的系统中,转义字符的作用不一定相同。例如,在Windows下的回车换行符可以使用"\r"或者"\n",而在Linux中这两者就有区别了,"\r"表示光标回到行首,但仍在本行;"\n"表示换到下一行,不会回到行首。
当需要输出大段文本时,一般选用定界符,它的输出形式和使用双引号输出的表现一致,具体内容将在5.3节中进行介绍。

图2-12 单引号和双引号中转义字符的区别
2. 布尔型
在PHP中,布尔型只能保存两个值:true值和false值,这两个值不区分大小写,即true===TRUE,false===FALSE,设定布尔型的变量,只需要把true或者false赋值给变量就可以了。
布尔型的变量通常用在条件语句中,下面通过一个实例介绍。
【例2-6】(实例文件:ch02\Chap2.6.php)布尔型。

在IE浏览器中运行结果如图2-13所示。
提示:在PHP中不是只有布尔值为假,在一些特殊情况下,非布尔值也被认为是假的,如0、"0"、0.0、空的字符串("")、只声明没有赋值的数组和特殊类型null等。

图2-13 布尔型
3. 整型
PHP中的整型其实就是数学中的整数。整型数据可以使用十进制、二进制、八进制或者十六进制表示,前面可以加上可选的符号(-或者+)。如果使用二进制,数字前必须加“0b”;使用八进制表示,数字前必须加“0”;使用十六进制表示,数字前必须加“0x”。
在32位的操作系统中,整型的取值范围是-2 147 483 648~+2 147 483 647。如果给定的一个整数超出了整型的取值范围,将会被解释为浮点型;同样,如果执行的运算结果超出了整型的取值范围,也会返回浮点型,这种情况称为整型溢出。
【例2-7】(实例文件:ch02\Chap2.7.php)整型。

在IE浏览器中运行结果如图2-14所示。
注意:细心的读者会发现,在例2-7中定义的两个八进制的整数,输出的结果是一样的,为什么呢?因为“$d=0456789”中出现了非法数字8和9,在定义八进制整数时,如果出现了8或者9等非法数字,后面的数字会被忽略掉。

图2-14 整型
4. 浮点型
PHP中的浮点数据类型其实就是数学中的小数。浮点数据类型既可以用来存储整型数据,也可以存储浮点型数据。在PHP 4.0之前,浮点型的标识为Double,也叫做双精度浮点数,两者没有什么区别。
浮点型数据默认两种书写格式,一种是标准格式,如-3.14、3.14;另一种是科学记数格式,如3.14e10、3.14E-10。
【例2-8】(实例文件:ch02\Chap2.8.php)浮点型。

在IE浏览器中运行结果如图2-15所示。
在PHP中,浮点型数值只是一个近似值,所以应该尽量避免浮点型数值之间的比较,因为最后的结果往往是不准确的。
如果出现需要判断两个浮点数是否相等时,可以使用bccomp()函数。bccomp()函数有三个返回值,分别为0、1和-1,返回0时表示相等,返回1时表示大于,返回-1时表示小于。bccomp()函数的语法如下:

图2-15 浮点型

其中,a和b表示要比较的数值;c表示精确到小数点后几位。
【例2-9】(实例文件:ch02\Chap2.9.php)bccomp()函数的用法。

在IE浏览器中运行结果如图2-16所示。

图2-16 bccomp()函数的用法
2.2.2 复合数据类型

复合数据类型包括两种,分别是Array(数组)和Object(对象),如表2-2所示。
表2-2 复合数据类型

1. 数组
数组是一系列数据集合起来形成的一个可操作的整体,一系列数据可以包括标量数据、对象、资源以及PHP中支持的其他语法结构等。一般把数组中的单个数据称为元素,元素又被分为索引(键名)和值两部分。索引(键名)可以是数字或者字符串,值可以是任何数据类型。
在PHP中,通常使用array()创建数组。准确来说,array()是一种结构而不是一个函数,具体格式如下:

在$array2中,参数key是数组元素的下标,value是数组下标所对应的元素。
也可以通过[]动态创建数组,例如下面的代码:

PHP中的var_dump()函数可以用来输出数组的类型以及值,这里用它输出$array,输出结构如图2-17所示。

图2-17 var_dump()输出数组$array
当然,还可以通过一些函数来创建数组,如compact()函数、range()函数和array_fill()函数等。本节只是简单了解一下数组,本书第6章将进行具体的介绍。
2. 对象
在面向对象(Object)的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。在现实世界里,我们所面对的事情都是对象,也就是所说的“万物皆对象”。例如,动物是一个抽象类,可以具体到一只牛和一只羊,而牛和羊就是具体的对象,它们有各自的颜色属性、可以跑等行为状态。关于对象将在第3章进行详细的介绍。
2.2.3 特殊数据类型

特殊数据类型包括两种类型:资源(Resource)和空值(Null)。
1. 资源
资源是一种特殊的变量类型,又叫作句柄,它是通过专门的函数来创建和使用的。资源可以被进行操作,如创建、使用和释放等。
任何资源,在不需要的时候都应该被及时释放。系统也会自动启用垃圾回收机制,在页面执行完毕后回收资源,以避免内存被消耗殆尽。
2. 空值
空值类型只有一个取值Null,它一般表示一个变量,没有值,也可以通过设置变量值为null清空变量数据。当遇到下面三种情况时,将会被赋予空值:
(1)没有赋予任何值的变量。
(2)被赋值为null的变量。
(3)被unset()函数处理过的变量。
【例2-10】(实例文件:ch02\Chap2.10.php)空值(Null)。

在IE浏览器中运行结果如图2-18所示。
在例2-10中,可以看到$str1、$str2和$str3判断的结果都为空,并且输出了相应的内容。其中变量$str2提示没有定义,变量$str3由于被unset()函数处理过,已经被销毁,所以也提示变量没有定义。
提示:is_null()函数用来判断变量是否为null,它的返回值为布尔型,如果变量为null,返回true,否则返回false。

图2-18 空值的应用
2.2.4 数据类型的获取

在PHP中可以使用getType()函数获取数据类型,只需要给该函数传递一个变量,它就会确定变量的类型,并且返回一个包含类型名称的字符串。具体的语法格式如下:

【例2-11】(实例文件:ch02\Chap2.11.php)获取数据类型实例。

在IE浏览器中运行结果如图2-19所示。
提示:var_dump()函数可以判断变量的数据类型,并输出变量的值。

图2-19 获取数据类型
2.2.5 PHP数据类型的转换

PHP虽然是弱类型语言,但有时也需要用到类型转换。在PHP数据类型的转换主要有以下三种转换方式。
(1)在要转换的变量之前加上用括号括起来的目标类型。这种方法只需在变量前面加上用括号括起来的类型名称即可,允许转换的类型如表2-3所示。
表2-3 允许转换的类型

【例2-12】(实例文件:ch02\Chap2.12.php)在变量之前加上目标类型转换。

在IE浏览器中运行结果如图2-20所示。
提示:print_r()函数相比较于前面介绍的print()函数来说,可以打印出复杂类型变量的值,如数组和对象。
(2)使用三个具体类型的转换函数,intval()、floatval()、strval()。其中,intval()函数用于转换为整型,floatval()函数用于转换为浮点型,strval()函数用于转换为字符型。
【例2-13】(实例文件:ch02\Chap2.13.php)使用intval()、floatval()、strval()转换数据类型。

在IE浏览器中运行结果如图2-21所示。

图2-20 在变量之前加上目标类型转换

图2-21 使用intval()、floatval()、strval()转换数据类型
(3)使用函数settype()进行转换。settype()函数用于设置变量的数据类型。语法格式如下:

其实就是设置变量$var的类型为type,type可以取前面章节中所讲的数据类型,如整型、浮点型、字符型等。
【例2-14】(实例文件:ch02\Chap2.14.php)settype()函数设置变量的数据类型。

在IE浏览器中运行结果如图2-22所示。
注意:在数据类型转化为boolean型时,null、0和未赋值的变量或数组都会被转换为false,其他的为true。在数据类型转换为整型时,布尔型的false转换为0,true转换为1;浮点型的小数部分被舍去;字符型如果以数字开头就截取到非数字的位置,如果以非数字开头,则输出0。

图2-22 settype()函数设置变量的数据类型