【PHP系列教程】(3)PHP的类型
PHP支持8种原始类型,其中包括: 4种标量类型:boolean(布尔型)、integer(整型)、float(浮点型)、string(字符型); 2种复合类型:array(数组)、object(对象); 2种特殊类型:resource(资源)、NULL 您可能还会读到一些关于双精度(double)类型的参考。实际上
PHP支持8种原始类型,其中包括:
4种标量类型:boolean(布尔型)、integer(整型)、float(浮点型)、string(字符型);
2种复合类型:array(数组)、object(对象);
2种特殊类型:resource(资源)、NULL
您可能还会读到一些关于“双精度(double)”类型的参考。实际上 double 和 float 是相同的,由于一些历史的原因,这两个名称同时存在。
变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的。
一、类型的介绍
注: 如果你想查看某个表达式的值和类型,用 var_dump()。
注: 如果你只是想得到一个易读懂的类型的表达方式用于调试,用 gettype()。要查看某个类型,不要用 gettype(),而用 is_type 函数。以下是一些范例:
代码1:
如果你要将一个变量强制转换为某类型,可以对其使用强制转换或者 settype() 函数。
二、布尔型
这是最简单的类型。boolean表达了真值,可以为TRUE或者FALSE。(注:布尔类型是PHP 4引进的)
要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都是大小写不敏感的。
通常你用某些运算符返回 boolean 值,并将其传递给流程控制。
要明示地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制需要一个 boolean 参数时,该值会被自动转换。
当转换为 boolean 时,以下值被认为是 FALSE:
布尔值 FALSE、整型值 0、浮点型值 0.0、空白字符串和字符串 "0"、没有成员变量的数组、没有单元的对象、特殊类型NULL(包括尚未设定的变量)
所有其它值都被认为是 TRUE(包括任何资源)。
注:-1 和其它非零值(不论正负)一样,被认为是 TRUE!
三、整型
一个 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一个数。
整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +)。
如果用八进制符号,数字前必须加上 0,用十六进制符号数字前必须加上 0x。
代码1:整数文字表达
在字面上,整型变量正式的结构可以为:
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。PHP 不支持无符号整数。
如果你指定一个数超出了 integer 的范围,将会被解释为 float。同样如果你执行的运算结果超出了 integer 范围,也会返回 float。
PHP 中没有整除的运算符。1/2 产生出浮点数 0.5。您可以总是舍弃小数部分,或者使用 round() 函数。
要明示地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。您还可以通过函数 intval() 来将一个值转换成整型。
1、从布尔型转换:FALSE 将产生出 0,TRUE 将产生出 1。
2、从浮点型转换:
当从浮点数转换成整数时,数字将被取整(丢弃小数位)。
如果浮点数超出了整数范围(通常为 +/- 2.15e+9 = 2^31),则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!
注:在 Linux 下返回结果是最小负数(-2147483648),而在 Windows 下返回结果是零(0)。
注:决不要将未知的分数强制转换为 integer,这样有时会导致意外的结果。
四、字符串
string 是一系列字符。在 PHP 中,字符和字节一样,也就是说,一共有 256 种不同字符的可能性。这也暗示 PHP 对 Unicode 没有本地支持。请参阅函数 utf8_encode() 和 utf8_decode() 以了解有关 Unicode 支持。
注:一个字符串变得非常巨大也没有问题,PHP 没有给字符串的大小强加实现范围,所以完全没有理由担心长字符串。
字符串可以用三种字面上的方法定义,分别为: 单引号、双引号、定界符
4.1 单引号
指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来。
要表示一个单引号,需要用反斜线(/)转义,和很多其它语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。注意如果你试图转义任何其它字符,反斜线本身也会被显示出来!所以通常不需要转义反斜线本身。
注: 在 PHP 3 中,此情况下将发出一个 E_NOTICE 级的警告。
注: 和其他两种语法不同,单引号字符串中出现的变量和转义序列不会被变量的值替代。
4.2 双引号
如果用双引号(")括起字符串,PHP 懂得更多特殊字符的转义序列:
表格1:转义字符
序列 | 含义 |
---|---|
/n | 换行(LF 或 ASCII 字符 0x0A(10)) |
/r | 回车(CR 或 ASCII 字符 0x0D(13)) |
/t | 水平制表符(HT 或 ASCII 字符 0x09(9)) |
// | 反斜线 |
/$ | 美元符号 |
/" | 双引号 |
/[0-7]{1,3} | 此正则表达式序列匹配一个用八进制符号表示的字符 |
/x[0-9A-Fa-f]{1,2} | 此正则表达式序列匹配一个用十六进制符号表示的字符 |
此外,如果试图转义任何其它字符,反斜线本身也会被显示出来!双引号字符串最重要的一点是其中的变量名会被变量值替代。
4.3 定界符
另一种给字符串定界的方法使用定界符语法(“
警告:很重要的一点必须指出,结束标识符所在的行不能包含任何其它字符,可能除了一个分号(;)之外。这尤其意味着该标识符不能被缩进,而且在分号之前和之后都不能有任何空格或制表符。同样重要的是要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。例如在 Macintosh 系统中是 /r。
如果破坏了这条规则使得结束标识符不“干净”,则它不会被视为结束标识符,PHP 将继续寻找下去。如果在这种情况下找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误。
定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出来的转义代码。变量会被展开,但当在定界符文本中表达复杂变量时和字符串一样同样也要注意。
代码1:定界符字符串例子
4.4 变量解析
当用双引号或者定界符指定字符串时,其中的变量会被解析。
有两种语法,一种简单的和一种复杂的。简单语法最通用和方便,它提供了解析变量,数组值,或者对象属性的方法。
复杂语法是 PHP 4 引进的,可以用花括号括起一个表达式。
如果遇到美元符号($),解析器会尽可能多地取得后面的字符以组成一个合法的变量名。如果你想明示指定名字的结束,用花括号把变量名括起来。
同样也可以解析数组索引或者对象属性。对于数组索引,右方括号(])标志着索引的结束。对象属性则和简单变量适用同样的规则,尽管对于对象属性没有像变量那样的小技巧。
4.5 复杂语法
不是因为语法复杂而称其为复杂,而是因为用此方法可以包含复杂的表达式。
事实上,用此语法你可以在字符串中包含任何在名字空间的值。仅仅用和在字符串之外同样的方法写一个表达式,然后用 { 和 } 把它包含进来。因为不能转义“{”,此语法仅在 $ 紧跟在 { 后面时被识别(用“{/$”或者“/{$”来得到一个字面上的“{$”)。用一些例子可以更清晰:
4.6 访问字符串中的字符
字符串中的字符可以通过在字符串之后用花括号指定所要字符从零开始的偏移量来访问。
注: 为了向下兼容,仍然可以用方括号。不过此语法在 PHP 4 中不赞成使用。
代码2:一些字符串的例子
4.7 实用函数及操作符
字符串可以用“.”(点)运算符连接。注意这里不能用“+”(加)运算符。更多信息参见字符串运算符。
有很多实用函数来改变字符串。
普通函数见字符串函数库一节,高级搜索和替换见正则表达式函数(两种口味:Perl 和 POSIX 扩展)。
还有 URL 字符串函数,以及加密/解密字符串的函数(mcrypt 和 mhash)。
4.8 字符串转换
您可以用 (string) 标记或者 strval() 函数将一个值转换为字符串。当某表达式需要字符串时,字符串的转换会在表达式范围内自动完成。例如当你使用 echo() 或者 print() 函数时,或者将一个变量值与一个字符串进行比较的时候。阅读手册中有关类型和类型戏法中的部分有助于更清楚一些。参见 settype()。
布尔值 TRUE 将被转换为字符串 "1",而值 FALSE 将被表示为 ""(即空字符串)。这样您就可以随意地在布尔值和字符串之间进行比较。
整数或浮点数数值在转换成字符串时,字符串即为表示这些数值数字(浮点数还包含有指数部分)。
数组将被转换成字符串 "Array",因此您无法通过 echo() 或者 print() 函数来输出数组的内容。请参考下文以获取更多提示。
对象将被转换成字符串 "Object"。如果您因为调试需要,需要将对象的成员变量打印出来,请阅读下文。如果您希望得到该对象所依附的类的名称,请使用函数 get_class()。
资源类型将会以 "Resource id #1" 的格式被转换成字符串,其中 1 是 PHP 在运行时给资源指定的唯一标识。如果您希望获取资源的类型,请使用函数 get_resource_type().
NULL 将被转换成空字符串。
正如以上所示,将数组、对象或者资源打印出来,并不能给您提供任何关于这些值本身的有用的信息。请参阅函数 print_r() 和 var_dump(),对于调试来说,这些是更好的打印值的方法。
您可以将 PHP 的值转换为字符串以永久地储存它们。这种方法被称为串行化,您可以用函数 serialize() 来完成该操作。如果您在安装 PHP 时建立了 WDDX 支持,您还可以将 PHP 的值串行化为 XML 结构。
4.9 字符串转换为数值
当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值。
如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float 来求值。否则就被当作整数。
该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为 0(零)。合法数字数据由可选的正负号开始,后面跟着一个或多个数字(可选地包括十进制分数),后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字。
如果你想测试本节中的任何例子,可以拷贝和粘贴这些例子并且加上下面这一行自己看看会发生什么:
不要指望在将一个字符转换成整型时能够得到该字符的编码(您可能也会在 C 中这么做)。如果您希望在字符编码和字符之间转换,请使用 ord() 和 chr() 函数。
五、数组
PHP 中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方面做了优化,因此你可以把它当成真正的数组来使用,或列表(矢量),散列表(是图的一种实现),字典,集合,栈,队列以及更多可能性。因为可以用另一个 PHP 数组作为值,也可以很容易地模拟树。
5.1 语法
可以用 array() 语言结构来新建一个 array。它接受一定数量用逗号分隔的 key => value 参数对。
key 可以是 integer 或者 string。如果键名是一个 integer 的标准表达方法,则被解释为整数(例如 "8" 将被解释为 8,而 "08" 将被解释为 "08")。PHP 中数组下标的变量类型不会对数组造成影响,数组的类型只有一种,它可以同时包含整型和字符串型的下标。
值可以是任何值。
如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果你指定的键名已经有了值,则该值会被覆盖。
警告:自 PHP 4.3.0 起,上述的索引生成方法改变了。如今如果你给一个当前最大键名是负值的数组添加一个新值,则新生成的的索引将为零(0)。以前新生成的索引为当前最大索引加一,和正值的索引相同。
使用 TRUE 作为键名将使 integer 1 成为键名。使用 FALSE 作为键名将使 integer 0 成为键名。使用 NULL 作为键名将等同于使用空字符串。使用空字符串作为键名将新建(或覆盖)一个用空字符串作为键名的值,这和用空的方括号不一样。
不能用数组和对象作为键名。这样做会导致一个警告:Illegal offset type。
5.2 用方括号的语法新建/修改
可以通过明示地设定值来改变一个现有的数组。
这是通过在方括号内指定键名来给数组赋值实现的。也可以省略键名,在这种情况下给变量名加上一对空的方括号("[]")。
如果 $arr 还不存在,将会新建一个。这也是一种定义数组的替换方法。要改变一个值,只要给它赋一个新值。如果要删除一个键名/值对,要对它用 unset()。
注: 如上所述,如果你给出方括号但没有指定键名,则取当前最大整数索引值,新的键名将是该值 + 1。如果当前还没有整数索引,则键名将为 0。如果制定的键名已经有值了,该值将被覆盖。
注意这里所使用的最大整数键名不一定当前就在数组中。它只要在上次数组重新生成索引后曾经存在过就行了。以下例子说明了:
以上例子将产生如下输出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) Array ( ) Array ( [5] => 6 ) Array ( [0] => 6 [1] => 7 )
5.3 实用函数
有相当多的实用函数作用于数组,unset() 函数允许取消一个数组中的键名。要注意数组将不会重建索引。
foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。