PHP+MySQL Web应用开发教程
上QQ阅读APP看书,第一时间看更新

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 标量数据类型

下面对各个数据类型进行详细介绍。

1.布尔型(boolean)

布尔型是PHP中较为常用的数据类型之一。它保存一个真值(TRUE)或者假值(FALSE)。布尔型数据的用法如下所示:

注:使用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的不可见字符串完成字符串的格式输出。

运行结果为,在IE浏览器中不能直接看到不可见字符串(\r、\n和\t)的作用效果。只有通过“查看源文件”才能看到不可见字符串的作用效果。

在PHP中,定义字符串有3种方式:单引号(')、双引号(")、界定符(<<<)。

单引号和双引号是经常被使用的定义方式,定义格式如下。

或:

注:

1)双引号中所包含的变量会自动被替换成实际数值,而在单引号中包含的变量则按普通字符串输出。

2)在定义字符串时,尽量使用单引号,因为单引号的运行速度要比双引号快。

【例2-11】使用单引号、双引号、界定符输出变量的值。

运行结果为:

注:使用界定符输出字符串时,结束标识符必须单独另起一行,并且不允许有空格。如果在标识符前后有其他符号或字符,则会发生错误。

3.整型(integer)

整型数据类型只能包含整数,即包含小数点的实数。在32位的操作系统中,有效的范围是-2 147 483 648~+2 147 483 647。整型数可以用十进制、八进制和十六进制来表示。如果用八进制,数字前面必须加0,如果用十六进制,则需要加0x。

【例2-12】输出八进制、十进制和十六进制的结果。

运行结果如下:

注:如果给定的数值超出了int类型所能表示的最大范围,将会被当作float型处理,这种情况叫作整数溢出。同样,如果表达式的最后运算结果超出了int的范围,也会返回float型。

如果在64位的操作系统中,其运行结果可能会有所不同。

4.浮点型(float)

浮点数据类型可以用来存储整数,也可以保存小数。它提供的精度比整数大得多。在32位的操作系统中,有效的范围是1.7E-308~1.7E+308。在PHP 4.0以前的版本中,浮点型的标识为double,也叫双精度浮点数,两者没什么区别。

浮点型数据默认有两种书写格式,一种是标准格式,如下所示。

还有一种是科学记数法格式,如下所示。

例如:

注:浮点型的数值只是一个近似值,所以要尽量避免浮点型之间比较大小,因为最后的结果往往是不准确的。

2.4.2 复合数据类型

复合数据类型包括两种:array(数组)和object(对象)。

1.数组(array)

数组是一组数据的集合,它把一系列数据组织起来,形成一个可操作的整体。数组中可以包括很多数据:标量数据、数组、对象、资源,以及PHP中支持的其他语法结构等。

数组中的每个数据称为一个元素,每个元素都有一个唯一的编号,称为索引。元素的索引只能由数字或字符串组成。元素的值可以是多种数据类型。

定义数组的语法格式如下。

其中参数key是数组元素的索引,value是数组元素的值。

【例2-13】数组应用示例。

运行结果为:

PHP数组与传统高级语言的数组的不同之处如表2-4所示。

表2-4 PHP数组与传统高级语言数组的区别

【例2-14】数组区别应用示例。

运行结果如下:

2.对象(object)

客观世界中的一个事物就是一个对象,每个客观事物都有自己的特征和行为。从程序设计的角度来看,事物的特征就是数据,也叫成员变量;事物的行为就是方法,也叫成员方法。面向对象的程序设计方法就是利用客观事物的这种特点,将客观事物抽象为“类”,而类是对象的“模版”。

【例2-15】对象的应用。

运行结果为:战狼II。

上述例子中,通过使用new关键字实例化一个$movie对象,然后通过如下方式访问该对象的成员变量和成员方法。

访问成员变量的方法:对象->成员变量(如$movie->name)。

访问成员方法的方法:对象->成员方法(如$movie->getName())。

其他有关面向对象的技术可以参考本书后面的内容。

2.4.3 特殊数据类型

特殊数据类型包括两种:resource(资源)和null(空值)。

1.资源(resource)

资源是由专门的函数来建立和使用的。它是一种特殊的数据类型,并由程序员分配。在使用资源时,要及时地释放不需要的资源。如果程序员忘记了释放资源,系统自动启用垃圾回收机制,避免内存消耗殆尽。例如,一个“数据库的连接”就是一个资源。

2.空值(null)

空值,顾名思义,表示没有为该变量设置任何值,另外,空值(null)不区分大小写,null和NULL效果是一样的。被赋予空值的情况有以下3种:没有赋任何值、被赋值为null、被unset()函数处理过的变量。

下面分别对这3种情况举例说明,具体代码如下:

运行结果为:

注:

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 类型强制转换

在进行类型转换的过程中应该注意以下几点。

1)转换成boolean型:null、0和未赋值的变量或数组,会被转换为false,其他的为真。

2)转换成整型。

① 布尔型的false转为0,true转为1。

② 浮点型的小数部分被舍去。

③ 字符串型。如果以数字开头,就截取到非数字位,否则输出0。

④ 当字符串转换为整型或浮点型时,如果字符是以数字开头的,就会先把数字部分转换为整型,再舍去后面的字串。如果数字中含有小数点,则会取到小数点前一位。

2.4.6 检测数据类型

PHP中提供了很多检测数据类型的函数,可以对不同类型的数据进行检测,判断其是否属于某个类型。检测数据类型的函数如表2-6所示。

表2-6 检测数据类型函数

【例2-16】下面通过几个检测数据类型的函数来检测相应的字符串类型。

运行结果为:

注:由于变量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()函数应用。

输出结果如下:

4.var_dump()函数输出每个表达式的类型和值

var_dump()函数用于判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。

显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

【例2-18】 var_dump()函数应用。

运行结果为:string(12)"alsdflasdf;a"。

注:var_dump()函数能打印出类型;print_r()函数只能打出值;echo()函数是正常输出;需要精确调试的时候用var_dump()函数;一般查看的时候用print_r()函数。