布尔型
这是最简单的类型。boolean 表达了真值,可以为 TRUE 或 FALSE。
注: 布尔类型是 PHP 4 引进的。
语法:要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都是大小写不敏感的。
[code=PHP]<?php $foo = True; // assign the value TRUE to $foo ?> [/code]
通常你用某些运算符返回 boolean 值,并将其传递给流程控制。
[code=PHP]// == is an operator which test // equality and returns a boolean if ($action == "show_version") { echo "The version is 1.23"; }
// this is not necessary... if ($show_separators == TRUE) { echo "<hr>/n"; }
// ...because you can simply type if ($show_separators) { echo "<hr>/n"; }[/code]
转换为布尔值
要明示地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制需要一个 boolean 参数时,该值会被自动转换。
当转换为 boolean 时,以下值被认为是 FALSE:
- 布尔值 FALSE
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空白字符串和字符串 "0"
- 没有成员变量的数组
- 没有单元的对象
- 特殊类型NULL(包括尚未设定的变量)
所有其它值都被认为是 TRUE(包括任何资源)。
警告: -1 和其它非零值(不论正负)一样,被认为是 TRUE! 整型
一个 integer 是集合 Z = {..., -2, -1, 0, 1, 2, ...} 中的一个数。
语法
整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +)。
如果用八进制符号,数字前必须加上 0(零),用十六进制符号数字前必须加上 0x。
例子: 整数文字表达
[code=PHP]<?php $a = 1234; # 十进制数 $a = -123; # 一个负数 $a = 0123; # 八进制数(等于十进制的 83) $a = 0x1A; # 十六进制数(等于十进制的 26) ?> [/code]
整型数的字长和平台有关,尽管通常最大值是大约二十亿(32 位有符号)。PHP 不支持无符号整数。
整数溢出
如果你指定一个数超出了 integer 的范围,将会被解释为 float。同样如果你执行的运算结果超出了 integer 范围,也会返回 float。
[code=PHP]<?php
$large_number = 2147483647; var_dump($large_number);
// 输出为:int(2147483647)
$large_number = 2147483648; var_dump($large_number);
// 输出为:float(2147483648)
// 同样也适用于十六进制表示的整数:
var_dump( 0x80000000 );
// 输出为:float(2147483648)
$million = 1000000; $large_number = 50000 * $million; var_dump($large_number);
// 输出为:float(50000000000)
?>[/code]
PHP 中没有整除的运算符。1/2 产生出浮点数 0.5。您可以总是舍弃小数部分,或者使用 round() 函数。
[code=PHP]<?php var_dump(25/7); // float(3.5714285714286) var_dump((int) (25/7)); // int(3) var_dump(round(25/7)); // float(4) ?> [/code]
转换为整形
要明示地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。您还可以通过函数 intval() 来将一个值转换成整型。
从布尔值转换
FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。
从浮点数转换
当从浮点数转换成整数时,数字将被取整(丢弃小数位)。
如果浮点数超出了整数范围(通常为 +/- 2.15e+9 = 2^31),则结果不确定,因为没有足够的精度使浮点数给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!
在 Linux 下返回结果是最小负数(-2147483648),而在 Windows 下返回结果是零(0)。
警告:决不要将未知的分数强制转换为 integer,这样有时会导致意外的结果。
[code=PHP]<?php echo (int) ( (0.1+0.7) * 10 ); // 显示 7! ?>[/code]
字符串转换为数值
当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值。
如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作 float 来求值。否则就被当作整数。
该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该数字作为其值,否则其值为 0(零)。合法数字数据由可选的正负号开始,后面跟着一个或多个数字(可选地包括十进制分数),后面跟着可选的指数。指数是一个“e”或者“E”后面跟着一个或多个数字。
[code=PHP]<?php $foo = 1 + "10.5"; // $foo is float (11.5) $foo = 1 + "-1.3e3"; // $foo is float (-1299) $foo = 1 + "bob-1.3e3"; // $foo is integer (1) $foo = 1 + "bob3"; // $foo is integer (1) $foo = 1 + "10 Small Pigs"; // $foo is integer (11) $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) $foo = "10.0 pigs " + 1; // $foo is float (11) $foo = "10.0 pigs " + 1.0; // $foo is float (11) ?>[/code]
浮点型
浮点数(也叫“floats”,“doubles”或“real numbers”)可以用以下任何语法定义:
[code=PHP]<?php $a = 1.234; $a = 1.2e3; $a = 7E-10; ?>[/code]
浮点数的字长和平台相关,尽管通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式)。
浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:
例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。
例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数库或者 gmp 函数库。
转换为浮点数
将字符串转换为数字
请看上篇贴子中的“将字符串转换为数字”。
对于其它类型的值,其情况类似于先将值转换成整型,然后再转换成浮点。 字符串
string 是一系列字符。在 PHP 中,字符和字节一样,也就是说,一共有 256 种不同字符的可能性。这也暗示 PHP 对 Unicode 没有本地支持。
注: 一个字符串变得非常巨大也没有问题,PHP 没有给字符串的大小强加实现范围,所以完全没有理由担心长字符串。
语法
字符串可以用三种字面上的方法定义:
单引号
指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来。
要表示一个单引号,需要用反斜线(/)转义,和很多其它语言一样。如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。注意如果你试图转义任何其它字符,反斜线本身也会被显示出来!所以通常不需要转义反斜线本身。
注: 和其他两种语法不同,单引号字符串中出现的变量和转义序列不会被变量的值替代。
[code=PHP]<?php echo 'this is a simple string';
echo 'You can also have embedded newlines in strings this way as it is okay to do';
// Outputs: Arnold once said: "I'll be back" echo 'Arnold once said: "I/'ll be back"';
// Outputs: You deleted C:/*.*? echo 'You deleted C://*.*?';
// Outputs: You deleted C:/*.*? echo 'You deleted C:/*.*?';
// Outputs: This will not expand: /n a newline echo 'This will not expand: /n a newline';
// Outputs: Variables do not $expand $either echo 'Variables do not $expand $either'; ?>[/code]
双引号
如果用双引号(")括起字符串,PHP 懂得更多特殊字符的转义序列: 表格: 转义字符
序列 | 含义 | /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} | 此正则表达式序列匹配一个用十六进制符号表示的字符 | 此外,如果试图转义任何其它字符,反斜线本身也会被显示出来!
双引号字符串最重要的一点是其中的变量名会被变量值替代。
定界符
另一种给字符串定界的方法使用定界符语法(“<<<”)。应该在 <<< 之后提供一个标识符,然后是字符串,然后是同样的标识符结束字符串。
结束标识符必须从行的第一列开始。同样,标识符也必须遵循 PHP 中其它任何标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符开始。
警告:
很重要的一点必须指出,结束标识符所在的行不能包含任何其它字符,可能除了一个分号(;)之外。这尤其意味着该标识符不能被缩进,而且在分号之前和之后都不能有任何空格或制表符。同样重要的是要意识到在结束标识符之前的第一个字符必须是你的操作系统中定义的换行符。例如在 Macintosh 系统中是 /r。
如果破坏了这条规则使得结束标识符不“干净”,则它不会被视为结束标识符,PHP 将继续寻找下去。如果在这种情况下找不到合适的结束标识符,将会导致一个在脚本最后一行出现的语法错误。
定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界符文本中不需要转义引号,不过仍然可以用以上列出来的转义代码。变量会被展开,但当在定界符文本中表达复杂变量时和字符串一样同样也要注意。
例子:定界符字符串例子
[code=PHP]<?php $str = <<<EOD Example of string spanning multiple lines using heredoc syntax. EOD; /* More complex example, with variables. */ class foo { var $foo; var $bar;
function foo() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } }
$foo = new foo(); $name = 'MyName';
echo <<<EOT My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should print a capital 'A': /x41 EOT; ?>[/code] | |