入门 - 变量类型转换

  • 作者:KK

  • 发表日期:2016.8.23


要点速读

  1. 变量类型的转换方式有强制转换和函数转换两种

  2. 强制转换的执行效率比函数快,因为是语法级别的

  3. 数学表达式和字符串拼接中如果类型不同,PHP会进行自动转换

  4. 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种:

  1. 通过intval这样的函数将一个输入的参数转换类型后返回出来

  2. 通过(类型名称)这样的强制转换符号来转换

强制转换是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),有兴趣可以看看,但平时我们基本不会用到,至少我从没用到