3.3 PHP的数据类型
PHP支持8种数据类型,包括4种标量数据类型,即boolean(布尔型)、string(字符串型)、integer(整型)和float/double(浮点型);2种复合数据类型,即array(数组)和object(对象);2种特殊数据类型,即resource(资源)和null(空值)。
说明
PHP中变量的类型通常不是由程序员设定的,确切地说,是PHP根据该变量使用的上下文在运行时决定的。
3.3.1 标量数据类型
标量数据类型是数据结构中最基本的单元,只能存储一个数据。PHP中标量数据类型包括4种,如表3.1所示。
表3.1 标量数据类型
1.布尔型(boolean)
布尔型变量通常保存一个true值或一个false值,其中true和false是PHP的内部关键字。布尔型变量通常应用在条件判断语句或循环控制语句的表达式中。
【例3.1】在if条件语句中判断变量$boo中的值是否为true,如果为true,则输出“变量$boo为真!”,否则输出“变量$boo为假!!”。(实例位置:资源包\TM\sl\3\1)
结果为:
变量$boo为真!
注意
在PHP中,不是只有false值才为假,一些特殊情况下,boolean值也被认为是false,这些特殊情况有0、0.0、"0"、空白字符串("")、只声明没有赋值的数组等。
说明
“$”是变量标识符,所有变量都以“$”开头,无论是声明变量还是调用变量,都应使用“$”标识。
2.字符串型(string)
字符串是连续的字符序列,由数字、字母和符号组成。字符串中的每个字符只占用一个字节。在PHP中,有3种定义字符串的方式,分别是单引号(')、双引号(")和定界符(<<<)。
单引号和双引号是经常使用的定义方式,定义格式如下:
<?php $a = '字符串'; ?>
或
<?php $a = "字符串"; ?>
两者的不同之处在于,双引号中所包含的变量会自动被替换成实际数值,而单引号中包含的变量则按普通字符输出。
【例3.2】应用单引号和双引号输出同一个变量。(实例位置:资源包\TM\sl\3\2)
单引号和双引号的输出结果完全不同,双引号输出的是变量的值,而单引号输出的是字符串“$i”。运行结果如图3.1所示。
两者之间另一个不同点是对转义字符的使用。使用单引号时,要想输出单引号,只要对单引号(')进行转义即可,但使用双引号(")时,还要注意“"”“$”等字符的使用。这些特殊字符都要通过转义字符“\”来显示。常用的转义字符如表3.2所示。
图3.1 单引号和双引号的区别
表3.2 常用的转义字符
\n和\r在Windows系统中没有什么区别,都可以当作回车符。但在Linux系统中则是两种效果,\n表示换到下一行,但不会回到行首;\r表示光标回到行首,但仍然在本行。如果读者使用Linux操作系统,可以尝试一下。
注意
如果对非转义字符使用了“\”,那么在输出时,“\”也会跟着一起被输出。
说明
定义简单字符串时使用单引号更加合适,使用双引号PHP将花费一些时间来处理字符串的转义和变量的解析。因此,如果没有特别的要求,定义字符串时应尽量使用单引号。
定界符(<<<)是从PHP 4开始支持的。使用时,在定界符后接一个标识符,然后是字符串,最后以同样的标识符结束字符串。定界符的格式如下:
$string = <<< str 要输出的字符串 str
其中,str为指定的标识符。
【例3.3】使用定界符输出变量的值。(实例位置:资源包\TM\sl\3\3)
运行结果如图3.2所示。可以看到,它和双引号的作用相同,包含的变量也被替换成实际数值。
图3.2 使用定界符定义字符串
注意
结束标识符可以使用空格或制表符(tab)缩进。如果结束标识符的缩进超过字符串的任何一行的缩进就会发生错误,而且在对结束标识符和字符串进行缩进时,制表符和空格不能混合使用。
3.整型(integer)
整型数据类型只能包含整数。整型数据的有效范围是-2147483648~+2147483647。整型数可以用十进制、八进制和十六进制来表示。如果用八进制,则数字前面必须加0;如果用十六进制,则需要加0x。
注意
在PHP 7之前的版本中,如果八进制中出现了非法数字(8和9),则后面的数字会被忽略。在PHP 7之后的版本中会编译报错。
【例3.4】输出八进制、十进制和十六进制整数。(实例位置:资源包\TM\sl\3\4)
<?php $str1 = 1234567; //声明一个十进制的整数 $str2 = 0x1234567; //声明一个十六进制的整数 $str3 = 01234567; //声明一个八进制的整数 echo '数字1234567不同进制的输出结果:<p>'; echo '十进制的结果是:'.$str1.'<br>'; //输出十进制整数 echo '十六进制的结果是:'.$str2.'<br>'; //输出十六进制整数 echo '八进制的结果是:'.$str3; //输出八进制整数 ?>
运行结果如图3.3所示。
图3.3 不同进制的输出结果
注意
如果给定的数值超出了integer型所能表示的最大范围,将会被当作float型处理,这种情况称为整数溢出。同样,如果表达式的最后运算结果超出了integer型的范围,也会返回float型。
4.浮点型(float)
浮点数据类型可以用来存储小数,它提供的精度比整数大得多,在64位的操作系统中,有效的范围是1.7E-308~1.7E+308。在PHP 4之前,浮点型的标识为double,也叫作双精度浮点数,float和double在PHP中没有什么区别。
浮点型数据默认有两种书写格式:一种是标准格式,如3.1415、-35.8等;还有一种是科学记数法格式(即指数格式),如3.58E1、849.72E-3等。
【例3.5】输出圆周率的近似值。采用3种不同的书写方法(圆周率函数、传统书写格式和科学记数法)表示,最后显示在页面上的效果都一样。(实例位置:资源包\TM\sl\3\5)
运行结果如图3.4所示。
注意
浮点型的数值只是一个近似值,所以要尽量避免在浮点型数值之间比较大小,因为最后的结果往往是不准确的。
图3.4 3种书写方法输出浮点类型
3.3.2 复合数据类型
复合数据类型包括数组和对象两种,如表3.3所示。
表3.3 复合数据类型
1.数组(array)
数组是一组数据的集合,它把一系列同类型数据组织起来,形成一个可操作的整体。数组中可以包括很多数据,如标量数据、数组、对象、资源以及PHP中支持的其他语法结构等。
数组中的每个数据都被称为一个元素,元素包括索引(键名)和值两个部分。元素的索引可以由数字或字符串组成,元素的值可以是多种数据类型。定义数组的语法格式有如下3种:
$array = array('value1', 'value2'…) $array[key] = 'value' $array = array(key1 => value1, key2 => value2…)
其中,key是数组元素的下标,value是数组下标所对应的元素。以下几种都是正确的声明数组格式:
$arr1 = array('This', 'is', 'an', 'example'); $arr2 = array(0 => 'php', 1 => 'is', 'the' => 'the', 'str' => 'best '); $arr3[0] = 'tmpname';
声明数组后,数组中的元素个数还可以自由更改。只要给数组赋值,数组就会自动增加长度。在第7章中会详细介绍数组的相关知识。
2.对象(object)
世间万物皆为对象,对象包含方法和属性。在PHP中,用户可以自由使用面向过程和面向对象这两种开发方法。第14章中我们将详细介绍面向对象的相关知识。
3.3.3 特殊数据类型
特殊数据类型包括资源(resource)和空值(null)两种,如表3.4所示。
表3.4 特殊数据类型
1.资源(resource)
关于资源的类型,可以参考PHP手册后面的附录,里面有详细的介绍和说明。使用资源时,系统会自动启用垃圾回收机制,释放不再使用的资源,避免内存消耗殆尽。因此,资源很少需要手工释放。
2.空值(null)
空值,顾名思义,就是没有为该变量设置任何值。另外,空值(null)不区分大小写,null和NULL效果是一样的。被赋予空值的情况有3种:未被赋任何值、被赋值为null、被unset()函数处理过。
【例3.6】被赋值为null的几种情况。(实例位置:资源包\TM\sl\3\6)
字符串string1被赋值为null。string2未被声明和赋值,所以也输出null。string3虽然被赋了初值,但被unset()函数处理后,也变为null型。unset()函数的作用是从内存中删除变量。
运行结果如图3.5所示。
图3.5 被赋值为null的几种情况
说明
isset()函数用于判断变量是否为null,该函数返回一个boolean型,如果变量为null,则返回true,否则返回false。unset()函数用来销毁指定的变量。
注意
从PHP 4开始,unset()函数就不再有返回值,所以不要试图获取或输出unset()。
3.3.4 数据类型转换
虽然PHP是弱类型语言,但有时仍然需要用到数据类型转换。PHP中的数据类型转换和C语言一样,非常简单,只需在变量前加上用括号括起来的类型名称即可。允许转换的类型如表3.5所示。
表3.5 数据类型强制转换
注意
在进行数据类型转换的过程中应该注意:转换成boolean型时,null、0以及未赋值的变量和数组会被转换为false,其他的转换为true;转换成整型时,布尔型的false转换为0,true转换为1,浮点型的小数部分被舍去,字符型如果以数字开头就截取到非数字位,否则输出0。
类型转换还可以通过settype()函数来完成,该函数可以将变量转换成指定的数据类型。函数格式如下:
bool settype(mixed var, string type)
其中,var为指定的变量;type为指定的类型,它有7个可选值,即boolean、float、integer、array、null、object和string。如果转换成功,则返回true,否则返回false。
当字符串转换为整型或浮点型时,如果字符串是以数字开头的,就会先把数字部分转换为整型,再舍去后面的字符串;如果数字中含有小数点,则会取到小数点前一位。
【例3.7】使用不同的方法对指定字符串进行类型转换。(实例位置:资源包\TM\sl\3\7)
运行结果如图3.6所示。
可以看到,使用integer操作符能直接输出转换后的变量类型,原变量不发生任何变化。使用settype()函数返回的是1,也就是true,且原变量被改变了。在实际应用中,可根据情况自行选择转换方式。
图3.6 类型转换
3.3.5 检测数据类型
PHP内置了一系列检测数据类型的函数,可以对不同类型的数据进行检测,判断其是否属于某个类型,如果是则返回true,否则返回false。检测数据类型的函数如表3.6所示。
表3.6 检测数据类型的函数
由于检测数据类型的函数的功能和用法都是相同的,下面使用is_numeric()函数来检测变量中的数据是否为数字,从而了解并掌握is系列函数的用法。
【例3.8】检测变量是否为电话号码(即全由数字组成)。(实例位置:资源包\TM\sl\3\8)
结果为:
Yes,the $boo is a phone number:043112345678!