3.2 数据类型
PHP支持7种数据类型。其中包括4种基本数据类型、两种复合数据类型和一种特殊数据类型。4种基本数据类型分别是整型、浮点型、布尔型、字符串;两种复合数据类型分别是数组和对象;一种特殊数据类型是NULL。
3.2.1 整型(integer)
整型数的字长和操作系统平台有关,在本书中均以32位操作系统为例来说明和解释程序。在32位操作系统中,它的有效范围是-2147483648~+2147483647。一个整型数是集合Z={-2147483648,…,-2,-1,0,1,2,…,+2147483647}中的一个数。
整型数的值可以用十进制、十六进制或八进制表示。在数字前加上0表示这个数据是八进制符号表示的数据。在数字前加上0x表示这个数据是十六进制符号表示的数据。
例如:
123表示十进制正数;-11表示十进制负数;0123表示的是八进制数,这个数等于十进制数83;0x1B表示的是十六进制数,这个数等于十进制数27。
如果给定的一个数超出了整型(integer)的表示范围,即数据产生溢出时,那么将会被解释为浮点(float)型数值。同样如果执行的运算结果超出了整型的表示范围,也会返回浮点型数值。
例如:
1 $integer_A=2147483647;//$integer_A为整型数据类型
2 $integer_A=$integer_A+1; //$integer_A自动转换为浮点型数据类型,值为2147483648
3 $integer_C=10000000; //$integer_C为整型数据类型
4 $integer_D=50000; //$integer_D为整型数据类型
5 $integer_D=$integer_D*$integer_C; //$integer_D自动转换为浮点型数据类型
第(2)行和第(5)行中“=”右边的运算结果都超出了整型数据类型的表示范围,PHP会自动将其数据类型转变为浮点型数据类型。这样运算结果会使变量$integer_A和$integer_D变成浮点型变量。
注意:
PHP语言支持3种风格的注释方式,分别是:
(1) “//”,只能注释一行。
(2)“/*”和“*/”,它们之间的内容都被认为是注释内容。
(3) “#”,也只能注释一行。
上面举例中的注释就属于第(1)种注释方式。
3.2.2 浮点型(float)
也叫浮点数、双精度数或实数。在32位的操作系统中,它的有效范围是1.7E-308~1.7E+308。
例如:
1.234表示浮点数(实数)1.234;1.2E4表示12000,即1.2*10。
在使用浮点型数据时,要考虑其精度。例如,floor((0.1+0.7)*10) 通常的返回值是7.0而不是预期中的8.0,这是因为该运算结果内部的表示其实是类似7.9999999999…,而没有指定返回精度导致出现上述返回值。
3.2.3 布尔型(boolean)
从PHP4开始引入了该数据类型。它和其他高级语言中的枚举数据类型有相似之处,可以把它理解成只包括TRUE或FALSE两个可取值的一种特殊枚举数据类型。
从以上的解释,不难理解布尔型的数据只能取TRUE或FALSE两个值中的一个值。
例如:
$boolean_A=TRUE;//变量$boolean_A的值为TRUE,是布尔型数据
$boolean_B=!$boolean_A; //变量$boolean_B的值为FALSE,是布尔型数据(!为逻辑非)。
3.2.4 字符串(string)
在PHP语言中,字符串可以包含任意字符。也就是说,一共有256种不同字符的可能性。另外PHP没有给字符串的大小强加实现范围,我们不用担心长字符串。
字符串可以用3种语法定义,分别是单引号(字符')、双引号(字符")和定界符(<<<)。
例如:
'this is a string!'和"PHP入门与精通"就是两个字符串。可以将这两个字符串内容赋值给两个字符串变量,在讲解变量时会举例说明。
如果字符串包含单引号(字符 ')、双引号(字符")等特殊字符,那么就需要使用转义字符\来表示。具体如表3-1所示:
表3-1 转义字符表示
使用定界符(<<<)定义字符串不是很常用,我们先看下面的例子:
$str_A= <<<EOD
白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼。
EOD;
上段PHP语言程序是将一首四句古诗作为一个字符串赋值给了字符串型变量$str_A。表示字符串的方法就是定界符(<<<)法。
在定界符<<<之后提供一个标识符,然后是字符串内容,然后用同样的标识符结束字符串。结束标识符必须从行的第一列开始。同样,标识符也必须遵循PHP中其他任何标签的命名规则:只能包含字母、数字、下画线,而且必须以下画线或非数字字符开始。另外结束标识符所在的行不能包含除紧跟其后的;外的任何其他字符,注释也不例外。
不能用定界符语法初始化类成员。
3.2.5 数组(array)
在PHP手册中将数组解释为一个有序图。数组属于复合数据类型,一个数组可以理解成具有相关性的一组数据的集合。这个集合中的一个元素称为数组的一个数据元素。一个数组中的数据元素既可以是基本数据类型也可以是复合数据类型,既可以是相同的数据类型也可以是不同的数据类型。
数组分为一维、二维、三维或多维数组,如图3-2所示。
图3-2 数组分类示意图
在其他高级语言中,数组元素的下标一般使用整数来表示。这个整数有的从0开始,有的从1开始。与其他高级语言所不同的是PHP语言中的数组元素的下标可以使用任何合法的标识符。例如:
$A=array( "name"=>"apple", "color"=>"red", "shape"=>"round", 4=>25 );
上面对数组$A各元素赋值后,则有:
$A["name"]="apple"; $A["color"]="red"; $A["shape"]="round"; $A[4]=25;
当然,如果不指定数组中数组元素的下标,那么PHP语言的下标默认值是从0开始,依次加1。
例如:
$b[] = 'a'; $b[] = 'b'; $b[] = 'c'; 等价于 $b=array(0 => 'a' , 1 => 'b' , 2 => 'c');
二维数组可以理解成每个数组元素都是一个一维数组的一维数组。以此类推,可以理解三维数组及多维数组的定义和使用。下面的例子说明了二维数组的定义方法。
例如:
$AB=array( "apple"=>array( "name"=>"apple", "color"=>"red", ), "orange"=>array( "name"=>"orange", "color"=>"orange", ), );
二维数组的数组元素$AB["orange"]["color"]的值为"orange"。
注意:
PHP语言中,数组元素的下标不再仅局限于使用数字,这样可以使用有实际意义的符号作为数组元素的下标,增加程序的可读性。
3.2.6 对象(object)
对象是类的实例。类是将数据与作用于这些数据的函数封装在一起的一种数据结构。类主要由数据成员和函数成员组成。类、对象、构造函数、封装、继承等概念是面向对象程序设计理论中的重要概念,详细内容请参考相关书籍,本书不作详细阐述。
我们定义一个类,就相当于定义了一种特定的复合数据类型;我们以这个类声明一个对象,就相当于创建了这个类的一个实例。
每个类的定义都以关键字class开头,后面跟着类名,可以是任何非PHP关键字的名字。后面跟着一对花括号,里面包含有类成员和方法的定义。这和C++基本相同。要创建一个类的实例,必须创建一个新对象并将其赋给一个变量。在创建一个新对象时,构造函数自动对新对象的数据成员进行初始化赋值。例如:
class Cart { var $todays_date; function Cart() { $this->todays_date = date("Y-m-d"); } } $cart1 = new Cart; $cart2 = new Cart;
上述代码首先定义了类Cart,其次声明了该类的两个对象$cart1和$cart2。过程如图3-3所示:
图3-3类和由该类派生的对象
3.2.7 NULL
从PHP4开始引进的一个特殊值NULL,表示一个变量没有值。所以NULL类型唯一可能的值就是大小写敏感的关键字NULL。
在下列情况下一个变量被认为是NULL:
值就是大小写敏感的关键字NULL。
在下列情况下的变量被认为是NULL:
1 被赋值为NULL。
2 尚未被赋值。
3 被unset()函数释放的变量。
例如:
$var=NULL;
注意:
特殊值NULL并非值0。
3.2.8 资源
资源是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的,同样需要专门的函数来回收。所有这些函数及其相应资源类型可以参考相关文献。
可以用is_resource()函数测定一个变量是否是资源,用函数get_resource_type()返回该资源的类型。例如:
3.2.9 数据类型的转换
在PHP中数据类型的转换分为自动转换和强制转换两种。
自动转换是指在变量定义中不需要指明其类型,变量类型是根据赋予值的数据类型决定的。也就是说,如果把一个字符串值赋给变量var,var就成了一个字符串。如果又把一个整型值赋给var,那它就成了一个整数。
在运算式中如果任何一个运算数是浮点数,则所有的运算数都被当成浮点数,结果也是浮点数。否则运算数会被解释为整数,结果也是整数。但是并不改变这些运算数本身的数据类型,改变的仅是这些运算数如何被使用。概括地说,就是以占用字节最长的运算数为标准数据类型,其他运算数自动转换为该数据类型。
例如:
$m_integer=5; $m_fl oat=6.0; $sum=$m_integer+$m_fl oat;//运算结果:$sum的值为浮点数11.0
当一个字符串被当做数字来求值时,如果包括“.”、“e”或“E”其中任何一个字符的话,字符串被当做浮点数来求值,否则就被当做整数。
如果字符串被当做浮点数类型,它的值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为0。合法数字数据由可选的正负号开始,后面跟着一个或多个数字(可选的包括十进制小数),后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字。
强制转换和C语言中的非常像,都是在要转换的变量之前加上用括号括起来的目标类型进行强制转换。
例如:
$A=1+"10.5"; // 变量$A的值是浮点类型,11.5 $A=1+"-1.3e3"; // 变量$A的值是浮点类型,-1299 $A=1+"some-1.3e3"; // 变量$A的值是整数类型,1
允许强制转换的有:
(int),(integer) ——转换成整型
(bool),(boolean) ——转换成布尔型
(float),(double),——转换成浮点型
(string) ——转换成字符串
(array) ——转换成数组
(object) ——转换成对象
当转换为boolean时,以下值被认为是FALSE:
★ 整型值0
★ 浮点型值0.0
★ 空白字符串和字符串"0"
★ 没有成员变量的数组
★ 没有成员的对象
★ 特殊类型NULL(包括尚未设定的变量)
所有其他值都被认为是TRUE。
当从浮点数转换成整数时,数字将被取整,小数位被丢弃。如果浮点数超出了整数范围,则结果不确定。
从布尔值转换为整数时,TRUE转换为1,FALSE转换为0。
字符串强制转换为整数时,转换规则与参与运算时的自动转换规则相同。
在PHP语言中将一个字符转换成整型时并不能够像C语言那样得到该字符的编码。在字符编码和字符之间转换,可以使用ord()和chr()函数。
布尔值TRUE将被转换为字符串"1",而值FALSE将被表示为""(即空字符串)。整数或浮点数数值在转换成字符串时,字符串由表示这些数值的数字字符组成(浮点数还包含有指数部分)。
数组将被转换成字符串"Array",对象将被转换成字符串"Object"。NULL将被转换成空字符串。
对于任何的类型:整型、浮点型、字符串、布尔型,如果将一个值转换为数组,将得到一个仅有一个元素的数组(其下标为0),该元素即为此标量的值。
如果将一个对象转换成一个数组,所得到的数组的元素为该对象的属性(成员变量),其键名为成员变量名。
如果将一个NULL值转换成数组,将得到一个空数组。
3.2.10 PHP中==和===的区别
==和===都属于比较运算符,用于比较两个变量或表达式的值是否相等。如果相等,则返回真值TRUE。反之,返回假值FALSE。==是松散比较,===是严格比较。
==和===两个比较运算符的区别是==只判断两个变量或表达式的值是否相等,而===运算符还要检查两个变量或表达式的数据类型是否一致,只有数值相等且数据类型一致才返回真值TRUE,否则返回假值FALSE。==和===两个比较运算符的返回值情况如表3-2所示:
表3-2 ==和===比较运算符的区别