转换为整数和浮点数
能转换为整数的类型只包括浮点数、布尔值,字符串和资源。数组、对象不能转换为数值类型。
转换为浮点数时,除了字符串转换为浮点数时有自己的一套规则外,而其他值都是先转换为整数(在能转换为整数的前提下),再转换为浮点数。
当从浮点数转换成整数时,将向下取整(小数部分丢弃)。如果浮点数超出了整数范围,则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!另外,由于浮点数的精度问题,有时候如果一个浮点运算的结果为xx.999999,那么直接转换为整数时由于是直接去年小数部分,会出现较大的误差。
$a = (integer)((0.1+0.7)*10);
var_dump($a); // int(7)
PHP 7.0.0 起,NaN 和 Infinity 在转换成 integer 时,都会变成零。
字符串(只支持十进制)转换为整数时,从第一个字符开始寻找合法的整数字符直到字符串结尾或遇到非整数字符,将找到的字符转换为整数,若无合法字符,结果为0。
字符串转换为浮点数时,从第一个字符开始寻找合法的浮点数字符直到字符串结尾或遇到非浮点数字符,将找到的字符转换为浮点数,若无合法字符,结果为0。
如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。
该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。
echo 0+"0xff","\n"; // 0
echo 0+"2.33","\n"; // 2.33
echo 0+"033","\n"; // 33
echo 0+"2e3","\n"; // 2000
null -> 0
true -> 1
false -> 0
将 resource 转换成 integer 时, 结果会是 PHP 运行时为 resource 分配的唯一资源号。
转换为字符串
true -> "1"
false -> ""
null -> ""
整数或浮点数转换为字符串,直接将数值表示成字符串(十进制、小数点形式)
数组转换为字符串时,结果都是"Array"
对象转换为字符串时,结果都是"Object"
资源转换字符串时,类似"Resource id#1"这样的字符串
转换为布尔值
当其它值转换为布尔值时,只有以下这些值会转换为false,其他的全都转换为true:
整数0
浮点数0.0
字符串"0"
字符串""
空数组(无元素)
空对象(无成员)
NULL(包括尚未设置的变量)
从空标记生成的 SimpleXML 对象
转换为数组
整数、浮点数、布尔值、字符串、资源转换为数组时,得到一个新数组,数组只有一个元素,这就元素的值便是相应的整数、浮点数、布尔值、字符串。
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NULL 字符。
将null转换为数组时,结果是一个空数组:
var_dump((array)null);
-------------------array(0) {
}
转换为对象
如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。
1.NULL转换为对象时,实例为空。
2.array 转换成对象将使键名成为属性名并具有相对应的值,除了数字键,不迭代就无法被访问。
3.对于其他值,会包含进成员变量名 scalar。
$a = "abc";
$arr = [1=>"a", 'a'=>"b"];
$obj1 = (object)$a;
$obj2 = (object)$arr;
var_dump($obj1);
var_dump($obj2);
--------------------
object(stdClass)#1 (1) {
["scalar"]=>
string(3) "abc"
}
object(stdClass)#2 (2) {
[1]=>
string(1) "a"
["a"]=>
string(1) "b"
}
显式转换
1.可以在变量前面添加强制类型转换运算符:
(int)(integer)
(float)(double)(real)
(bool)(boolean)
(string)
(array)
(object)
(unset) -转换为NULL
(binary) -转换为二进制字符串,也可以在字符串上使用b前缀
这种方式并没有改变变量的数据类型,而只是改变了表达式的数据类型。
$a = "abc";
$b = true;
$c = 32;
var_dump((binary)$a); // string(3) "abc"
var_dump((binary)$b); // string(1) "1"
var_dump((binary)$c); // string(2) "32"
var_dump(b'xyz'); // string(3) "xyz"
2.使用settype(var, type)函数
bool settype ( mixed &$var , string $type )
$var = true;
settype($var, "integer");
var_dump($var); // int(1)
可见,变量的类型和值都被修改了
type的取值包括:boolean/bool/integer/int/float/string/array/object/null
3.使用intval()/floatval()/boolval()/strval()系列函数
注意,这些函数并不会修改变量的值
$var = "0xff";
$num = intval($var, 16);
var_dump($var); // string(4) "0xff"
var_dump($num); // int(255)
如果intval()函数的第一个参数是一个字符串,则可以再提供一个可选的第二参数,以指定字符串中数值的进制。如果不提供此参数,则默认按十进制处理,参数指定为0,则会以字符串的形式自动判断(以0x开头为十六进制。。)
intval()不能用于对象类型
该函数返回一个转换后的整数值,如果转换失败,返回0,如果参数是数组,则非空数组返回1,空数组返回0
boolval()获取参数的布尔值。
floatval()函数的参数只能是标量类型,如整数、浮点数、布尔值、字符串。不能用于数组或对象。
strval()函数的参数只能是标量类型,如整数、浮点数、布尔值、字符串。不能用于数组或对象。
什么情况下会进行隐式转换
算术运算符的两个操作数都会被转换为数值类型。
字符串连接符的两个操作数都会被转换为字符串类型。
在一个需要字符串的表达式中,会自动转换为string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。