
转为布尔型
要将一个值明确的转换为布尔类型,可以使用“(bool)”或“(boolean)”来强制转换,但是大多数情况下不需要强制转换,在运算符、函数、或者流程控制结构需要一个布尔值时,会自动进行转换。转换规则为:整型0、浮点型0.0、空字符串、字符串“0”、不包含任何元素的数组、特殊类型NULL、空标记生成的SimpleXML对象都会转为false,其他情况为true。
<?php var_dump((bool) ""); // bool(false) var_dump((bool) 1); // bool(true) var_dump((bool) -1); // bool(true) var_dump((bool) "test"); // bool(true) var_dump((bool) 1.23e4); // bool(true) var_dump((bool) array(1)); // bool(true) var_dump((bool) array()); // bool(false) var_dump((bool) "false"); // bool(true) ?>
转为整型
要将一个值明确的转换为布尔类型,可以使用“(int)”或“(integer)”来强制转换, 但是大多数情况下不需要强制转换,在运算符、函数、或者流程控制结构需要一个布尔值时,会自动进行转换。还可以听过intval()函数进行转换。转换规则为:1.将资源转换为整型时,转换的结果是PHP在运行时为资源分配的唯一资源号。
2.false转换为0,true转换为1。
3.浮点型转整型会向下取整,如果浮点型超出了整型范围,则结果为undefined,因为没有足够的精度给出一个确切的整数结果,PHP7起,NaN 和 Infinity会转换为0。
4.字符串转为整型时,如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由PHP_INT_MAX定义),则字符串被当做整型取值,其他情况下当做浮点型取值。字符串的开始部分决定了转换后的值,如果字符串以合法的数值(可选的正负号,后面跟着一个或多个数字,可能有小数点,然后是指数部分(由e或E后面跟着一个或多个数字)构成)开始,则使用该数值,否则为0。
5.PHP中没有定义其他类型转换为整型的行为。
<?php $foo = 1 + "10.5"; var_dump($foo);//float (11.5) $foo = 1 + "-1.3e3"; var_dump($foo);//float (-1299) $foo = 1 + "bob-1.3e3"; var_dump($foo);//integer (1) $foo = 1 + "bob3"; var_dump($foo);//integer (1) $foo = 1 + "10 Small Pigs"; var_dump($foo);//integer (11) $foo = 4 + "10.2 Little Piggies"; var_dump($foo);//float (14.2) $foo = "10.0 pigs " + 1; var_dump($foo);//float (11) $foo = "10.0 pigs " + 1.0; var_dump($foo);//float (11) ?>
转为浮点型
转为浮点型与转为整型类型,通常是将值先转为整型然后再转为浮点型,PHP5起,试图将对象转为浮点型会生成E_NOTICE错误信息。转为字符串
要将一个值明确的转换为布尔类型,可以使用“(string)”或“strval()”来强制转换,在一个需要字符串的表达式中,会自动转为字符串,如echo、print、或者与一个字符串进行比较时。1.布尔值true会转换为字符串1,false会转换为空字符串""。
2.整数或浮点型会转换为字面样式的字符串,包括使用指数计数法的数字。
3.数组总是会被转换为字符串Array。
4.在PHP4中对象总是被转换为字符串object,但是在PHP5以后则会产生一个Recoverable fatal error错误,但是可以通过在类中定义适当的__toString函数来避免这个错误,还可通过get_class()函数获取对象的类的名称。
5.资源总是被转换成"Resource id #1" 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该资源的唯一值。要得到资源的类型可以使用get_resource_type()函数。
6.NULL总是会被转换为空字符串""。
对于直接转换为字符串不会得到除类型之外的任何有用信息的数组、对象和资源,可以使用print_r()和var_dump()函数列出这些类型的内容。
<?php class A{ function __toString(){ return "this is class A"; } } $foo = true; var_dump((String)$foo);//string(1) "1" $foo = false; var_dump((String)$foo);//string(0) "" $foo = 123; var_dump((String)$foo);//string(3) "123" $foo = -1.3e3; var_dump((String)$foo);//float (-1300) $foo = 1.23e-3; var_dump((String)$foo);//string(7) "0.00123" $foo = array(); var_dump((String)$foo);//string(5) "Array" $foo = array(1,2,3); var_dump((String)$foo);//string(5) "Array" var_dump($foo); print_r($foo); $foo = NULL; var_dump((String)$foo);//string(0) "" $foo = new A; var_dump((String)$foo);//string(15) "this is class A" var_dump($foo); print_r($foo); var_dump(get_class($foo));//string(1) "A" ?>
转换为数组
对于任意整型、浮点型、字符串、布尔类型、资源类型,如果将其转换为数组,会得到一个仅包含一个元素的数组,其下标为0;NULL转换为数组会得到一个空的数组;如果一个对象转换为数组,结果为一个键为成员变量名、值为变量值的数组,其中,整数属性不可访问,私有变量前会加上类名做为前缀,受保护的变量前会加“*”做为前缀,这些前缀前后各有一个null字符,会导致一些不可预知的行为,<?php class A { private $A="aa"; // This will become '\0A\0A' } class B extends A { private $A="ba"; // This will become '\0B\0A' public $AA="baa"; // This will become 'AA' } var_dump((array)NULL); $foo=(array) new B(); var_dump($foo); echo $foo["\0A\0A"]."\n";//aa echo $foo["AA"]."\n";//baa echo $foo["\0B\0A"]."\n";//ba ?>
转换为对象
将一个对象转换为对象不会有任何变化,如果其他类型的值被转换为对象,将会创建一个内置类stdClass的实例,如果值为NULL,则新的实例为空。数组转换成对象,将使键名成为属性,值为属性值。在PHP5中,如果键为数字,则不能直接通过键来访问值,而在PHP7中,会将数字键做为字符串,因此可以通过数字键直接访问值。而其他值则会被包含在成员变量scalar中。<?php $obj = (object) array(1 => 'foo'); var_dump($obj); var_dump(isset($obj->{1})); var_dump(key($obj)); $obj = (object) array("2"=> 'foo'); var_dump($obj); var_dump(isset($obj->{2})); var_dump(isset($obj->{"2"})); var_dump(key($obj)); $obj = (object) array("a"=> 'foo'); var_dump($obj); var_dump(isset($obj->{"a"})); var_dump(key($obj)); $obj =(object) NULL; var_dump($obj); $obj =(object) "test"; var_dump($obj); var_dump($obj->{"scalar"}); ?>
转换为NULL
使用(unset)$var将一个变量转换为null,不会删除该变量或unset其值,只是返回null<?php $foo="abc"; var_dump($foo); var_dump((unset)$foo); var_dump($foo); ?>
文章来源: PHP数据类型转换
人吐槽 | 人点赞 |
发表评论