入门 - 变量类型转换 ¶
作者:KK
发表日期:2016.8.23
要点速读 ¶
变量类型的转换方式有强制转换和函数转换两种
强制转换的执行效率比函数快,因为是语法级别的
数学表达式和字符串拼接中如果类型不同,PHP会进行自动转换
PHP程序员应该掌握常见的转换参数和结果,这样才能提高对自己所写的程序计算结果的预测能力
函数转换 与 强制转换 ¶
变量的类型是可以互相转换的,比如:
$a = '123';
echo gettype($a); //string
$b = intval($a); //intval函数将输入的内容转换成int类型
echo gettype($b); //int
以上是通过intval函数来转换变量的类型,但其实通常我都提倡使用强制类型转换
,先看代码:
$a = '123';
echo gettype($a); //string
$b = (int)$a; //前面加 (类型名称) 就可以了
echo gettype($b); //int
$c = 123;
echo gettype($c); //int
$d = (string)$c;
echo gettype($d); //string
所以说转换变量类型的方式有2种:
通过
intval
这样的函数将一个输入的参数转换类型后返回出来通过
(类型名称)
这样的强制转换符号来转换
强制转换是PHP语法的一部分,执行语法比执行函数的效率高,所以使用强制转换会更加高效,代码质量更好
转换后不一定能保留原来的值: ¶
$a = '5a';
echo (int)$a; //5 用intval也是一样的
以上代码a的值不是纯数字,强制转成数字的话PHP只会取前面的数字部分,所以值的非数字部分丢失了
各种常见的转换值变化效果演示: ¶
var_export([
'(int)"0"' => (int)'0', //0
'(int)"1"' => (int)'1', //1
'(int)"00"' => (int)'00', //0
'(int)"01"' => (int)'01', //1
'(int)"10"' => (int)'10', //10
'(int)"0a"' => (int)'0a', //0
'(int)"123a"' => (int)'123a', //123
'(int)" 123b"' => (int)' 123b', //123
'(int)"a123"' => (int)'a123', //0
'(int)"a123b456"' => (int)'a123b456', //0
'(int)"a123b456 c"' => (int)'a123b456 c', //0
'(int)" 0"' => (int)' 0', //0
'(int)"2147483648"' => (int)'2147483647', //超出int型上限,只保留最大值
'(string)0' => (string)0, //'0'
'(string)1' => (string)1, //'1'
'(string)1234' => (string)1234, //'1234'
'(string)0123' => (string)0123, //'83' 由于这个数字是0开头,所以视为8进制的数字,转成10进制得83,再变成字符串
'(string)-9' => (string)-9, //'-9'
'(bool)0' => (bool)0, //false
'(bool)1' => (bool)1, //true
'(bool)23' => (bool)23, //true
'(bool)-1' => (bool)-1, //true
'(bool)""' => (bool)'', //false
'(bool)"abc"' => (bool)'abc', //true
'(bool)" abc"' => (bool)' abc', //true
'(array)0' => (array)0, //array(0 => 0) 被转换的值成为了第一个元素
'(array)1' => (array)1, //array(0 => 1)
'(array)5454' => (array)5454, //array(0 => 5454)
'(array)" abc"' => (array)' abc', //array(0 => ' abc')
'(array)false' => (array)false, //array(0 => false)
'(array)true' => (array)true, //array(0 => true)
'(array)[1, 2, 3]' => (array)[1, 2, 3], //array(0 => 1, 1 => 2, 2 => 3) 把数组强转成数组,于是没效果,依然是数组,因为不需要转换嘛
'(array)[]' => (array)[], //array() 空数组一样
]);
函数式与强制语法的对照:
intval
函数和(int)
是一样的strval
函数和(string)
是一样的doubleval
函数和(double)
是一样的floatval
函数和(float)
是一样的
其它强制转换符号暂时没发现有对应的函数,就以上这四个xxval函数了
运算时也会发生自动转换 ¶
下面两个变量相加,但一个是数字类型,一个是字符串类型,PHP要先将它们都转换成数字类型才可以进行加法计算,看看效果:
$a = 123;
$b = 'a223';
echo $a + $b; //123
因为a223
在参与计算时被底层自动转换成数值,由于是字母开头,于是被转换成数字0,再与123相加结果还是123咯,再来一个:
$a = ' 222';
$b = ' 333 ';
echo $a + $b; //555
字符串左右两边的空格先被去掉了,再转换成数字,所以转换成功,得“222 + 333 = 555”;而如果是数组进行计算则会出现异常:
$a = [1, 2, 3];
echo 'abc' . $a; //abcArray 数组部分被转换成了 Array 这个类型字符名称字符串
echo 222 + $a; //直接出错,提示不支持的操作类型
其它类型在参与加法和字符串拼接运算时的情况就不一一列举了,大家知道会有自动转换的情况就行,处理数据小心点啦,确认你清楚运算符两边的操作数是啥类型
总结 ¶
PHP程序员应该掌握常见的转换参数和结果,这样才能提高对自己所写的程序计算结果的预测能力
偏门知识 ¶
强制类型转换还有(binary)
、(object)
和(unset)
,有兴趣可以看看,但平时我们基本不会用到,至少我从没用到