部分摘自PHP: 类型 - Manual
PHP 在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量 $var,$var 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer。
PHP 的自动类型转换的一个例子是加法运算符“+”。如果任何一个操作数是float,则所有的操作数都被当成float,结果也是float。否则操作数会被解释为integer,结果也是integer。注意这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。
PHP允许的强制转换
(int), (integer) - 转换为整形 integer
(bool), (boolean) - 转换为布尔类型 boolean
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(unset) - 转换为 NULL (PHP 5)
字符串转为数值
如果该字符串没有包含 ‘.‘,‘e‘ 或 ‘E‘ 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。
该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 ‘e‘ 或 ‘E‘ 后面跟着一个或多个数字构成。
1 <?php 2 $sSeparate = "\t"; 3 echo ‘结果‘,$sSeparate,‘类型‘,"\n"; 4 $mFoo = 1 + ‘10.5‘; 5 echo $mFoo,$sSeparate,getType($mFoo),"\n"; 6 7 $mFoo = 1 + ‘10‘; 8 echo $mFoo,$sSeparate,getType($mFoo),"\n"; 9 10 $mFoo = 1 + ‘-1.3e3‘; 11 echo $mFoo,$sSeparate,getType($mFoo),"\n"; 12 13 $mFoo = 1 + ‘hello‘; 14 echo $mFoo,$sSeparate,getType($mFoo),"\n"; 15 16 $mFoo = 1 + ‘99hello‘; 17 echo $mFoo,$sSeparate,getType($mFoo),"\n"; 18 19 $mFoo = 1 + ‘99.90hello‘; 20 echo $mFoo,$sSeparate,getType($mFoo),"\n"; 21 ?> 22 结果 类型 23 11.5 double 24 11 integer 25 -1299 double 26 1 integer 27 100 integer 28 100.9 double
转为整型
要明确地将一个值转换为 integer,用 (int) 或 (integer) 强制转换。不过大多数情况下都不需要强制转换,因为当运算符,函数或流程控制需要一个 integer 参数时,值会自动转换。还可以通过函数 intval() 来将一个值转换成整型。
从布尔值转换
FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。
从浮点型转换
当从浮点数转换成整数时,将向下取整。
转为字符串型
一个值可以通过在其前面加上 (string) 或用 strval() 函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。类型和类型转换可以更好的解释下面的事情,也可参考函数 settype()。
一个布尔值 boolean 的 TRUE 被转换成 string 的 "1"。Boolean 的 FALSE 被转换成 ""(空字符串)。这种转换可以在 boolean 和 string 之间相互进行。
一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。
Note:
在脚本的区域(category LC_NUMERIC)中定义了十进制小数点字符。参见 setlocale()。
数组 array 总是转换成字符串 "Array",因此,echo 和 print 无法显示出该数组的内容。要显示某个单元,可以用 echo $arr[‘foo‘] 这种结构。要显示整个数组内容见下文。
在 PHP 4 中对象 object 总是被转换成字符串 "Object"。
资源 resource 总会被转变成 "Resource id #1" 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type()。
NULL 总是被转变成空字符串。
如上面所说的,直接把 array,object 或 resource 转换成 string 不会得到除了其类型之外的任何有用信息。可以使用函数 print_r() 和 var_dump() 列出这些类型的内容。
1 <?php 2 var_dump(strval(10)); #string(2) "10" 3 var_dump(strval(FALSE)); #string(0) "" 4 var_dump(strval(true)); #string(1) "1" 5 var_dump(strval(100.09)); #string(6) "100.09" 6 var_dump(strval(NULL)); #string(0) "" 7 ?>
转为数组型
对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 完全一样。
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*‘ 做前缀。这些前缀的前后都各有一个 NULL 字符。
NULL为空数组
1 <?php 2 print_r((array)10); 3 /* 4 Array 5 ( 6 [0] => 10 7 ) 8 */ 9 print_r((array)100.09); 10 /* 11 Array 12 ( 13 [0] => 100.09 14 ) 15 */ 16 17 print_r((array)0); 18 /* 19 Array 20 ( 21 [0] => 0 22 ) 23 */ 24 print_r((array)-10); 25 /* 26 Array 27 ( 28 [0] => -10 29 ) 30 */ 31 print_r((array)‘string‘); 32 /* 33 Array 34 ( 35 [0] => string 36 ) 37 */ 38 print_r((array)‘0‘); 39 /* 40 Array 41 ( 42 [0] => 0 43 ) 44 */ 45 print_r((array)true); 46 /* 47 Array 48 ( 49 [0] => 1 50 ) 51 */ 52 print_r((array)FALSE); 53 /* 54 Array 55 ( 56 [0] => 57 ) 58 */ 59 print_r((array)NULL); 60 /* 61 Array 62 ( 63 ) 64 */ 65 66 class A 67 { 68 private $_A = ‘A‘; #私有 69 protected $B; #受保护的 70 } 71 72 class B extends A 73 { 74 public $C; #公有 75 public function __construct() 76 { 77 $this->B = ‘B‘; 78 $this->C = ‘C‘; 79 } 80 } 81 print_r((array) new B()); 82 /* 83 Array 84 ( 85 [C] => C 86 [A_A] => A,私有变量前面会加上类名作为前缀 87 [*B] => B,受保护变量回家上*作为前缀 88 ) 89 */ 90 ?>
转为布尔型
要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。
1 <?php 2 /** 3 * 当转换为 boolean 时,以下值被认为是 FALSE: 4 * 布尔值 FALSE 本身 5 * 整型值 0(零) 6 * 浮点型值 0.0(零) 7 * 空字符串,以及字符串 "0" 8 * 不包括任何元素的数组 9 * 不包括任何成员变量的对象(仅 PHP 4.0 适用) 10 * 特殊类型 NULL(包括尚未赋值的变量) 11 * 从空标记生成的 SimpleXML 对象 12 **/ 13 var_dump(FALSE); #bool(false) 14 var_dump((boolean)‘‘); #bool(false) 15 var_dump((boolean)‘string‘); #bool(true) 16 var_dump((boolean)‘0‘); #bool(false) 17 var_dump((boolean)1); #bool(true) 18 var_dump((boolean)1.0); #bool(true) 19 var_dump((boolean)-1); #bool(true) 20 var_dump((boolean)0); #bool(false) 21 var_dump((boolean)2.2e5); #bool(true) 22 var_dump((boolean)array(‘one‘,‘two‘)); #bool(true) 23 var_dump((boolean)array()); #bool(false) 24 $sTest = ‘test‘; 25 unset($sTest); 26 var_dump((boolean)$sTest); #bool(false) 27 var_dump((boolean)null); #bool(false) 28 var_dump((boolean)$sNotDefined); #bool(false) 29 ?>
表达式 | gettype() | empty() | is_null() | isset() | boolean : if($x) |
---|---|---|---|---|---|
$x = ""; | string | TRUE |
FALSE |
TRUE |
FALSE |
$x = null; | NULL | TRUE |
TRUE |
FALSE |
FALSE |
var $x; | NULL | TRUE |
TRUE |
FALSE |
FALSE |
$x is undefined | NULL | TRUE |
TRUE |
FALSE |
FALSE |
$x = array(); | array | TRUE |
FALSE |
TRUE |
FALSE |
$x = false; | boolean | TRUE |
FALSE |
TRUE |
FALSE |
$x = true; | boolean | FALSE |
FALSE |
TRUE |
TRUE |
$x = 1; | integer | FALSE |
FALSE |
TRUE |
TRUE |
$x = 42; | integer | FALSE |
FALSE |
TRUE |
TRUE |
$x = 0; | integer | TRUE |
FALSE |
TRUE |
FALSE |
$x = -1; | integer | FALSE |
FALSE |
TRUE |
TRUE |
$x = "1"; | string | FALSE |
FALSE |
TRUE |
TRUE |
$x = "0"; | string | TRUE |
FALSE |
TRUE |
FALSE |
$x = "-1"; | string | FALSE |
FALSE |
TRUE |
TRUE |
$x = "php"; | string | FALSE |
FALSE |
TRUE |
TRUE |
$x = "true"; | string | FALSE |
FALSE |
TRUE |
TRUE |
$x = "false"; | string | FALSE |
FALSE |
TRUE |
TRUE |