![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=1739205296-fmu9a3E5p5R8oS3D7LcIoNw0by6Of7hT-0-210954aaab042e5f53b9d3280408de58)
下面对各个数据类型进行详细介绍。
1.布尔型(boolean)
布尔型是PHP中较为常用的数据类型之一。它保存一个真值(TRUE)或者假值(FALSE)。布尔型数据的用法如下所示:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/51_02.jpg?sign=1739205296-K7xzYzaR1nbJqWLZoRxiv3uZLwl8ZbhD-0-422b5557f41b02f824b7901125651a67)
注:使用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=1739205296-e3y9yDrmu7DEwuZ6VpUo7QpJu6yBoYA6-0-dfc79f2acef1bee61e838b132b9651e6)
运行结果为,在IE浏览器中不能直接看到不可见字符串(\r、\n和\t)的作用效果。只有通过“查看源文件”才能看到不可见字符串的作用效果。
在PHP中,定义字符串有3种方式:单引号(')、双引号(")、界定符(<<<)。
单引号和双引号是经常被使用的定义方式,定义格式如下。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_01.jpg?sign=1739205296-1ypBbdsRTLLQkihoBv3NH0q9WFXmlU1j-0-63c76e44297d06824c6fdd9f8235e8ed)
或:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_02.jpg?sign=1739205296-nfxod7ty4B0Z7QVcOI53Ja3AwClGey5M-0-02541ab6618d61d3bc76018a36d10193)
注:
1)双引号中所包含的变量会自动被替换成实际数值,而在单引号中包含的变量则按普通字符串输出。
2)在定义字符串时,尽量使用单引号,因为单引号的运行速度要比双引号快。
【例2-11】使用单引号、双引号、界定符输出变量的值。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_03.jpg?sign=1739205296-hbPw9bk2T5EeojbbOXRWxaHIkElzXhRa-0-04b29fa34a300ee137e297a907bce052)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/52_04.jpg?sign=1739205296-HbYPZGQeNPNQVs5I24jGKU4Y3qxaLLST-0-29dbf316eaeef02ddfd6dd82729475ea)
注:使用界定符输出字符串时,结束标识符必须单独另起一行,并且不允许有空格。如果在标识符前后有其他符号或字符,则会发生错误。
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=1739205296-eo0R2AiM4UVUxK3a4JOyDgPpUws0C59z-0-ba115eda68b374add4eb65bfcbb76b05)
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_01.jpg?sign=1739205296-FqFTKnPSgxslvOYE8ce58LHLqwKunQgc-0-e92218b861d2cf2679d90d08681a6f54)
运行结果如下:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_02.jpg?sign=1739205296-IU8WFuzv4rzSOhynpjFjtjfFhGOxKple-0-00dbea1fca8952e0e6960b59f6fb0a0c)
注:如果给定的数值超出了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=1739205296-AX2PSH45RgtrtXFi09PwnvRT7vIdBZ7s-0-ed9d5917bffe064e3488849142ddeb3d)
还有一种是科学记数法格式,如下所示。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_04.jpg?sign=1739205296-vdg468CLf75og0aI4vQirIj7C5Mxr2Qj-0-e6f729220e0651488dd07e046e58034e)
例如:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/53_05.jpg?sign=1739205296-WDKhePmWHP8dJQ6yl9FZUy2gdj6pof12-0-79767d402e7149e8e3e6fd3b2cb92223)
注:浮点型的数值只是一个近似值,所以要尽量避免浮点型之间比较大小,因为最后的结果往往是不准确的。
2.4.2 复合数据类型
复合数据类型包括两种:array(数组)和object(对象)。
1.数组(array)
数组是一组数据的集合,它把一系列数据组织起来,形成一个可操作的整体。数组中可以包括很多数据:标量数据、数组、对象、资源,以及PHP中支持的其他语法结构等。
数组中的每个数据称为一个元素,每个元素都有一个唯一的编号,称为索引。元素的索引只能由数字或字符串组成。元素的值可以是多种数据类型。
定义数组的语法格式如下。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_01.jpg?sign=1739205296-iHqgD23VRMyjQnen2uRpB3ia7MaDSRWx-0-37c40a3174c2b387d99903379e78f8a5)
或
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_02.jpg?sign=1739205296-bh2fl259c6ZkQlJMRvEk5hVovLqc3xnO-0-b4583fbff2d6e06a2737b65fbfddee4e)
其中参数key是数组元素的索引,value是数组元素的值。
【例2-13】数组应用示例。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_03.jpg?sign=1739205296-G412uazyr4VBrPO8uBy67MjpCIybp2RD-0-aa8141cb19b0f8fe4aa159d01eb41f04)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_04.jpg?sign=1739205296-BYVQX8gE2KXdFcLnf1u8sMMnGI9J58nj-0-95006691c702b72b8c5aa083e2fa89aa)
PHP数组与传统高级语言的数组的不同之处如表2-4所示。
表2-4 PHP数组与传统高级语言数组的区别
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_05.jpg?sign=1739205296-OECtFG0jMkE5WMFVSh0pAkMSqtT7yiIt-0-1e61f8bfaded72c94bde5f7a39dd63ed)
【例2-14】数组区别应用示例。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/54_06.jpg?sign=1739205296-clDWuaaG7UugVeh9LW8BtYTYA4LfmTmf-0-1d06ceb9222dd4a9c5e3a68bdb1e72b0)
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/55_01.jpg?sign=1739205296-nPJQzQ1MO2IOv6AKWlQzaiuzguvL7wdM-0-d1bb1cfc139498044b3c49e57a7ff2ea)
运行结果如下:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/55_02.jpg?sign=1739205296-FsiE3Bvzzeo6CFmESN3zGWH7GBNgQjr4-0-f9285320f3da6b02763fe4bd9d001d7e)
2.对象(object)
客观世界中的一个事物就是一个对象,每个客观事物都有自己的特征和行为。从程序设计的角度来看,事物的特征就是数据,也叫成员变量;事物的行为就是方法,也叫成员方法。面向对象的程序设计方法就是利用客观事物的这种特点,将客观事物抽象为“类”,而类是对象的“模版”。
【例2-15】对象的应用。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/55_03.jpg?sign=1739205296-Cew3D2OhUOHTo6WMRpRGiWWCQA0dzixD-0-7650d30e9e51fb152b55b2d2572d1176)
运行结果为:战狼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=1739205296-HBdSBuqWte9VQZbzIiCmAXAhbvXvxX10-0-3ffc0f1df964ddafdc5f067d402703be)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/56_02.jpg?sign=1739205296-1XPI8RIGJI0Sd3ta2U6jJe8rqziOO7h0-0-ed6fa8e3c0a92ea3b14e729b361bc3ec)
注:
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=1739205296-U6Vp2jzEsyuh9lGIB29BT1N8x4tlW4mt-0-1a7de0591ba17d1427f6b122b4293f6d)
在进行类型转换的过程中应该注意以下几点。
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=1739205296-42v5O9v0aEjvSaTafzqaB8652zCNHpdw-0-e0ea03e5ad277c176e22b5efb250a1d8)
【例2-16】下面通过几个检测数据类型的函数来检测相应的字符串类型。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/58_02.jpg?sign=1739205296-QWK25cQvlen1ZuTdBf4edXF48lUpELUg-0-e4927130241a1da8e01c259c30aa8f72)
运行结果为:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/58_03.jpg?sign=1739205296-DzV9jwVe6DCJGAlYYCjgSDs2lM4DpIxw-0-8f33e54364dd789b670a1f6f1f4b3d35)
注:由于变量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=1739205296-7k2NfFMMX2zsScdQpP8BkG1wqxUVy6Jt-0-3d2942a4500fa514a809de561df1e14a)
输出结果如下:
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/59_02.jpg?sign=1739205296-i9TdEIp3HiNLQSTiGDGUHfM5NHcjT8fJ-0-e9d11f0702e9338750f2923f2bd72f5b)
4.var_dump()函数输出每个表达式的类型和值
var_dump()函数用于判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。
显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
【例2-18】 var_dump()函数应用。
![](https://epubservercos.yuewen.com/A81163/18123624508030506/epubprivate/OEBPS/Images/60_01.jpg?sign=1739205296-dzcb7JfndTcVCxN7yJcHWTNEUBJ8Jg06-0-3814fdab3aa62d28f3c162c1c2676c30)
运行结果为:string(12)"alsdflasdf;a"。
注:var_dump()函数能打印出类型;print_r()函数只能打出值;echo()函数是正常输出;需要精确调试的时候用var_dump()函数;一般查看的时候用print_r()函数。