转为布尔型
要将一个值明确的转换为布尔类型,可以使用“(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);
?>