![PHP+MySQL Web应用开发教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/889/33892889/b_33892889.jpg)
2.4 PHP数据类型
计算机操作的对象是数据,而每一个数据都有其类型,具备相同类型的数据才可以彼此操作。PHP的数据与传统的高级语言相同之处如下。
1)PHP使用变量或常量实现数据在内存中的存储,并使用变量名(例如$userName)或常量名(例如PI)实现了内存数据的按名存取。
2)PHP使用等于号“=”(赋值运算符)给变量赋值。
3)PHP不允许直接访问一个未经初始化的变量,否则PHP预处理器会提示Notice信息。
4)PHP提供变量作用域的概念实现内存数据的安全访问控制。
5)PHP引入了数据类型的概念修饰和管理数据。
PHP与传统的高级语言不同之处如下。
1)PHP变量名之前要加“$”符号标识,例如$userName变量。
2)PHP是一种“弱类型的语言”,声明变量或常量时,不需要事先声明变量或常量的数据类型,PHP会自动由PHP预处理器根据变量的值将变量转换成适当的数据类型。
PHP的数据类型可以分为4种:标量数据类型、复合数据类型、特殊数据类型和伪类型。其中标量数据类型共有4种:布尔型、整型、浮点型和字符串型;复合数据类型共有两种:数组和对象;特殊数据类型有资源数据类型和空数据类型;伪类型通常在函数的定义中使用。
2.4.1 标量数据类型
标量数据类型是数据结构中最基本的单元,只能存储一个数据。PHP中标量数据类型包括4种,如表2-3所示。
表2-3 标量数据类型
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/51_01.jpg?sign=1739299151-a5399eEydbWUqjW6HZm2Kx5gJ9GDPJ9N-0-d3e40a3df1fd4d08a1650f2a99bf4a3a)
下面对各个数据类型进行详细介绍。
1.布尔型(boolean)
布尔型是PHP中较为常用的数据类型之一。它保存一个真值(TRUE)或者假值(FALSE)。布尔型数据的用法如下所示:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/51_02.jpg?sign=1739299151-rPiHePujymGLiYC6OoXJx43AJz3jT30A-0-36052f886a88e8e478f4f2d22ef1cc2f)
注:使用echo输出TRUE时,TRUE被自动地转换为整数1;使用echo输出FALSE时,FALSE被自动地转换为空字符串。
2.字符串型(string)
字符串是连续的字符序列,由数字、字母和符号组成。字符串中的每个字符只占用一个字节。字符包含以下几种类型。
1)数字类型。例如1、2、3等。
2)字母类型。例如a、b、c、d等。
3)特殊字符。例如#、$、%、^、&等。
4)不可见字符。例如\n(换行符)、\r(回车符)、\t(Tab字符)等。
其中,不可见字符是比较特殊的一组字符,是用来控制字符串格式化输出的,在浏览器上不可见,只能看到字符串输出的结果。
【例2-10】运用PHP的不可见字符串完成字符串的格式输出。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/51_03.jpg?sign=1739299151-oXP2hlMsG7uHvflDtwBhW7sj84SWpQlx-0-2bbf897000c386190a0810fd665ccea6)
运行结果为,在IE浏览器中不能直接看到不可见字符串(\r、\n和\t)的作用效果。只有通过“查看源文件”才能看到不可见字符串的作用效果。
在PHP中,定义字符串有3种方式:单引号(')、双引号(")、界定符(<<<)。
单引号和双引号是经常被使用的定义方式,定义格式如下。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_01.jpg?sign=1739299151-01o0FhOEdPfWybcuORbUqssps2hQSd9B-0-6af0d71f4e17a2f7a25d490dbb06552c)
或:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_02.jpg?sign=1739299151-2CJ5pInwNDBnPxFmVPWMLGrPGjf5ggDf-0-168d585e0f6f028c8b500899ee7fd052)
注:
1)双引号中所包含的变量会自动被替换成实际数值,而在单引号中包含的变量则按普通字符串输出。
2)在定义字符串时,尽量使用单引号,因为单引号的运行速度要比双引号快。
【例2-11】使用单引号、双引号、界定符输出变量的值。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_03.jpg?sign=1739299151-1z5PHWmtYIPdGgHqmY7jT7eRBpe6FBs3-0-d85ab8bbee6c19c57c7ed40233c16fd1)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_04.jpg?sign=1739299151-d5A0X21mAYMHA2Sg5molLiL7GNUog9D8-0-c24803699da89212eb59f3e08b84bd04)
注:使用界定符输出字符串时,结束标识符必须单独另起一行,并且不允许有空格。如果在标识符前后有其他符号或字符,则会发生错误。
3.整型(integer)
整型数据类型只能包含整数,即包含小数点的实数。在32位的操作系统中,有效的范围是-2 147 483 648~+2 147 483 647。整型数可以用十进制、八进制和十六进制来表示。如果用八进制,数字前面必须加0,如果用十六进制,则需要加0x。
【例2-12】输出八进制、十进制和十六进制的结果。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_05.jpg?sign=1739299151-Rzegq4XnDkw44r8PU9uvec9TCKl2xC7z-0-b75f05670679210cbcf4bfbc7d2ceeee)
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_01.jpg?sign=1739299151-LX21EDdL9g1xQk8ErD1OaPIUBLKHswqA-0-ad9fc41157fffb554463c4b9f553413f)
运行结果如下:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_02.jpg?sign=1739299151-kAOCwlv8SYRuiM3r6oiKAOUNi4ESwUpG-0-a45351a307a28bf1051e379a509bb1fc)
注:如果给定的数值超出了int类型所能表示的最大范围,将会被当作float型处理,这种情况叫作整数溢出。同样,如果表达式的最后运算结果超出了int的范围,也会返回float型。
如果在64位的操作系统中,其运行结果可能会有所不同。
4.浮点型(float)
浮点数据类型可以用来存储整数,也可以保存小数。它提供的精度比整数大得多。在32位的操作系统中,有效的范围是1.7E-308~1.7E+308。在PHP 4.0以前的版本中,浮点型的标识为double,也叫双精度浮点数,两者没什么区别。
浮点型数据默认有两种书写格式,一种是标准格式,如下所示。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_03.jpg?sign=1739299151-anSMTgsYStGTTA0vbjeGVTBCJGDz2l0D-0-e3dd2d0d619abe8f5daf6c8f887ede10)
还有一种是科学记数法格式,如下所示。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_04.jpg?sign=1739299151-ymCNjpGefRhALr39bTwaadYQRo3s2eNI-0-bf55835afa40d725e2d3fbcb9b4c149e)
例如:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_05.jpg?sign=1739299151-ANmetW8zNxQkBSBfZz9he6RjVmY0po0o-0-5a54a9dff7b294d9a4ea30f281331f97)
注:浮点型的数值只是一个近似值,所以要尽量避免浮点型之间比较大小,因为最后的结果往往是不准确的。
2.4.2 复合数据类型
复合数据类型包括两种:array(数组)和object(对象)。
1.数组(array)
数组是一组数据的集合,它把一系列数据组织起来,形成一个可操作的整体。数组中可以包括很多数据:标量数据、数组、对象、资源,以及PHP中支持的其他语法结构等。
数组中的每个数据称为一个元素,每个元素都有一个唯一的编号,称为索引。元素的索引只能由数字或字符串组成。元素的值可以是多种数据类型。
定义数组的语法格式如下。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_01.jpg?sign=1739299151-gNWxbtuPmUlEe9DPrySCdi947UOBNPXK-0-b68a069cb4439f83f31872c0b61f01c1)
或
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_02.jpg?sign=1739299151-BaKG3BOAbeuDcvJr1q6hpWYXsOC916Xo-0-da4125b3bc438dfde37b5dffe4cd5840)
其中参数key是数组元素的索引,value是数组元素的值。
【例2-13】数组应用示例。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_03.jpg?sign=1739299151-xWEKM4c2zzVH37146okfuQW3UsaWFdWI-0-ccf5f2d7393e3f411dccd3f6e82c3d00)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_04.jpg?sign=1739299151-XqFr8ozWDB0hkAeT4Z2w3JjUidrfCRLK-0-c83dc0a42b7708b014e8b47d72d4598e)
PHP数组与传统高级语言的数组的不同之处如表2-4所示。
表2-4 PHP数组与传统高级语言数组的区别
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_05.jpg?sign=1739299151-20dvLP6ots4yajhMRxqmU5LPGAhlYBKX-0-67a398ba53b3d996a60636e5754d3f75)
【例2-14】数组区别应用示例。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_06.jpg?sign=1739299151-t9iixzwd8AzNMGCAVCZBchY9JqFtu7Wk-0-6522355ea160cb1d4a323b0cf61bd638)
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/55_01.jpg?sign=1739299151-DK9BDTB71ceVbIZAeUq4hC4b0ViElK7j-0-fd4cf1cb58ea0a7026c797d99ef5dbf4)
运行结果如下:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/55_02.jpg?sign=1739299151-QiMUceZ5qNiQTt8rXtAfw2JugBzTUu0X-0-3943d434e87049288e528fa3d315b416)
2.对象(object)
客观世界中的一个事物就是一个对象,每个客观事物都有自己的特征和行为。从程序设计的角度来看,事物的特征就是数据,也叫成员变量;事物的行为就是方法,也叫成员方法。面向对象的程序设计方法就是利用客观事物的这种特点,将客观事物抽象为“类”,而类是对象的“模版”。
【例2-15】对象的应用。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/55_03.jpg?sign=1739299151-64Mi0IvNHbLg48KcJ5kPs9Zj9JoVBwJI-0-f8553e9116a8e7b49da62e8845b379f4)
运行结果为:战狼II。
上述例子中,通过使用new关键字实例化一个$movie对象,然后通过如下方式访问该对象的成员变量和成员方法。
访问成员变量的方法:对象->成员变量(如$movie->name)。
访问成员方法的方法:对象->成员方法(如$movie->getName())。
其他有关面向对象的技术可以参考本书后面的内容。
2.4.3 特殊数据类型
特殊数据类型包括两种:resource(资源)和null(空值)。
1.资源(resource)
资源是由专门的函数来建立和使用的。它是一种特殊的数据类型,并由程序员分配。在使用资源时,要及时地释放不需要的资源。如果程序员忘记了释放资源,系统自动启用垃圾回收机制,避免内存消耗殆尽。例如,一个“数据库的连接”就是一个资源。
2.空值(null)
空值,顾名思义,表示没有为该变量设置任何值,另外,空值(null)不区分大小写,null和NULL效果是一样的。被赋予空值的情况有以下3种:没有赋任何值、被赋值为null、被unset()函数处理过的变量。
下面分别对这3种情况举例说明,具体代码如下:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/56_01.jpg?sign=1739299151-2kCs3lrBahdSY0l3vjKTDVk0kZ7zzQ0N-0-f69477ab9ac20bea852f92709eff7e2e)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/56_02.jpg?sign=1739299151-mcbAcL8XjRK4jVw5jDanvpNFvqZj9ygD-0-9fddfa20ab1c2ca7c472150e8fb4e6fa)
注:
1)var_dump()方法,判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。
显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
2)取消变量定义unset()函数,unset()函数语法格式为:void unset(mixed var)。
函数功能:取消变量var的定义。该函数的参数为变量名(带$符号),函数没有返回值。
3)isset()函数,语法格式为:bool isset(mixed var)。
函数功能:检查变量var是否定义。该函数参数为变量名(带$号),如果变量已经定义,该函数返回布尔值true,否则返回false。
2.4.4 伪类型
PHP引入4种伪类型用于指定一个函数的参数或返回类型。常见有如下4种。
1)mixed混合类型:mixed说明一个参数可以接受多种不同的类型,但并不是所有的类型。
2)number数字类型:number参数可以接受integer整型和float浮点型。
3)callback回调类型:例如call_user_func()函数就可接收用户自定义的函数作为一个参数,它是PHP的一个内置函数。callback函数不仅可以是一个函数,也可以是一个对象的方法,静态类的方法也可以。一个PHP函数用函数名字符串来传递,可以传递任何内置的或者用户自定义的函数,除了语言结构例如array()、echo()、empty()、eval()、exit()、isset()、list()、print()、unset()等。
如果要传入一个对象的方法,需要以数组的形式来传递,数组下标0是对象名,下标1是方法名。要是没有实例化为对象的静态类,要传递其方法,要将数组0下标指明的对象名换成该类的名称。
除了普通的用户定义的函数外,也可以使用create_function来创建一个匿名的回调函数。
4)void:说明函数没有参数或返回值。
注:伪类型不能作为变量的数据类型,使用伪类型主要是为了确保函数的易读性。
2.4.5 转换数据类型
PHP中的类型转换和C语言一样,非常简单。在变量前面加上一个小括号,并把目标数据类型写在小括号中即可。
PHP中允许转换的类型如表2-5所示。
表2-5 类型强制转换
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/57_01.jpg?sign=1739299151-HbfXhn6IyIob0wLqkjIsDrxPqvb7nv9Q-0-7f8f03748445fec05ea72acbbc64e0ac)
在进行类型转换的过程中应该注意以下几点。
1)转换成boolean型:null、0和未赋值的变量或数组,会被转换为false,其他的为真。
2)转换成整型。
① 布尔型的false转为0,true转为1。
② 浮点型的小数部分被舍去。
③ 字符串型。如果以数字开头,就截取到非数字位,否则输出0。
④ 当字符串转换为整型或浮点型时,如果字符是以数字开头的,就会先把数字部分转换为整型,再舍去后面的字串。如果数字中含有小数点,则会取到小数点前一位。
2.4.6 检测数据类型
PHP中提供了很多检测数据类型的函数,可以对不同类型的数据进行检测,判断其是否属于某个类型。检测数据类型的函数如表2-6所示。
表2-6 检测数据类型函数
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/58_01.jpg?sign=1739299151-UHNkmlw3pXg54ltVAHR1pRdmQAVcwUn0-0-7aad83c381ef8bae480101565b363e63)
【例2-16】下面通过几个检测数据类型的函数来检测相应的字符串类型。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/58_02.jpg?sign=1739299151-yPiuTghqC0O8pK2ejpx4EGWPbMbL7E90-0-dc02b85fc27c01e6dc27e6951c19b1e0)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/58_03.jpg?sign=1739299151-EBF90QaLkb7LSQzcNzH5XfVdyqKTY5Sq-0-e5b03fbfc6d584b82f2cd3b7f07574c3)
注:由于变量C不是浮点型,所以第4个判断的返回值为false,即空值。
2.4.7 PHP数据的输出
PHP经常使用echo语句向浏览器输出字符串数据,除了echo语句外,还可以使用print语句或printf()函数向浏览器输出字符串数据。
echo与print输出的是没有经过格式化的字符串,而printf()函数则是输出经过格式化的字符串。
对于复合数据类型的数据(如数组或对象),可选用print_r()函数输出。
如果HTML代码块中只嵌入一条PHP语句,且该PHP语句是一条输出语句,此时可以使用输出运算符<?=?>输出字符串数据。
1.print和echo
print和echo的功能几乎完全一样,都是用于向页面输出字符串。两者的区别在于:使用echo可以同时输出多个字符串(多个字符串之间使用逗号隔开即可),而print一次只能输出一个字符串。其他区别如下。
1)在echo前不能使用错误抑制符“@”。
2)print也可以看作是一个有返回值的函数,此时print只能作为表达式的一部分,而echo不能。
2.输出运算符“<?=?>”
如果HTML代码块中只嵌入一条PHP语句,且PHP语句是一条输出语句,此时若使用echo或print语句输出字符串不仅麻烦,而且降低领导程序的易读性。PHP提供了使用输出运算符,输出字符串数据。例如:<?=date("Y-m-d")?>。
3.print_r()函数
对于复合数据类型的数据输出,经常使用print_r()函数。使用print_r()函数输出数组中的元素或对象中的成员变量时,将按照“键”=>“值”对或者“成员变量名”=>“值”的方式输出元素或对象的内容。
【例2-17】 print_r()函数应用。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/59_01.jpg?sign=1739299151-p4ZLH2rJTXGSb57fWhq7tmPgdfIQvFww-0-0f7c38eeeb20deb158c78499c19b613c)
输出结果如下:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/59_02.jpg?sign=1739299151-1ri7d27QArRD1ldS5Deun9T5SD7suzBd-0-f093f788f7d74a1126338f2558f29dce)
4.var_dump()函数输出每个表达式的类型和值
var_dump()函数用于判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。
显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
【例2-18】 var_dump()函数应用。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/60_01.jpg?sign=1739299151-Y3fl7jqXdhnDqBfM02RNDuHt6GYcPEW8-0-13e1502367add3b445b1ae0714e21361)
运行结果为:string(12)"alsdflasdf;a"。
注:var_dump()函数能打印出类型;print_r()函数只能打出值;echo()函数是正常输出;需要精确调试的时候用var_dump()函数;一般查看的时候用print_r()函数。