3.5 数据类型的转换
PHP中任何变量或常量都有一个“隐式的”数据类型,数据类型是由赋给变量或常量的值自动确定的。同一表达式中可以包含不同数据类型的常量及变量,这些常量或变量进行计算前,须转换为同一数据类型的数据。PHP类型转换包括类型自动转换和强制转换。
3.5.1 类型自动转换
类型自动转换是指在定义变量或常量时,不需要指定变量或常量的数据类型,由PHP预处理器根据具体应用环境,将变量或常量转换为合适的数据类型。例如,当字符串执行算术运算时,PHP预处理器会将字符串转换为数值类型后,再进行算术运算;当数值执行字符串连接运算,PHP预处理器会将数值转换为字符串类型后,再进行字符串连接运算。类型自动转换基本规则如下。
(1)布尔型数据参与算术运算时,TRUE 被转换为整数 1,FALSE 被转换为整数 0;NULL参与算术运算时,被转换为整数0。例如,程序rules1.php如下。
<?php
$a = TRUE;
$b = FALSE;
$c = NULL;
$d = $a + 1;
$e = $b + 1;
$f = $c + 2;
var_dump($d); //输出:int(2)
echo "<br/>";
var_dump($e); //输出:int(1)
echo "<br/>";
var_dump($f); //输出:int(2)
?>
(2)浮点数与整数进行算术运算时,将整数转换为浮点数后,再进行算术运算。例如,程序rules2.php如下。
<?php
$a = TRUE;
$b = FALSE;
$c = $a + 1.0;
$d = $b + 1.0;
var_dump($c); //输出:float(2)
echo "<br/>";
var_dump($d); //输出:float(1)
?>
说明:程序rules2.php执行算术运算时,先将TRUE转换为整数1,再将整数1转换为浮点数1进行运算。
(3)参与算术运算的字符串,只有以数字开头的字符串才会被认作数字。字符串开头部分符合整数格式时,字符串将被转换为整数,例如在执行算术运算时字符串"3rd degree"将被转换为整数 3;字符串开头部分符合浮点数格式时(字符串开头中可以包含“.”、“e”或“E”字符),字符串会被转换为浮点数,例如在执行算术运算时字符串"3.5"、"−4.01"、"4.2e6"、"−4.1 degree"分别被转换为浮点数3.5、−4.01、4200000、−4.1。如果字符串不是以数字开头,将被转换整数0,例如在执行算术运算时,字符串"Catch 22"将被转换为数整数0。例如,程序rules3.php如下。
<?php
$a = 1;
$b = "-4.01";
$c = "4.2e6";
$d = "-4.1degree";
$e = $a + "6th";
$f = $a + $b;
$g = $a + $c;
$h = $a + $d;
$i = $a + "degree";
var_dump($e); //输出:int(7)
echo "<br/>";
var_dump($f); //输出:float(-3.01)
echo "<br/>";
var_dump($g); //输出:float(4200001)
echo "<br/>";
var_dump($h); //输出:float(-3.1)
echo "<br/>";
var_dump($i); //输出:int(1)
?>
(4)在进行字符串连接运算时,整数、浮点数将被转换为字符串类型数据。例如,12、12.3 转换为字符串后为"12"、"12.3"。布尔型TRUE将被转换成字符串"1",布尔型FALSE和NULL将被转换成空字符串"",这就解释了为何语句“echo TRUE;”打印到页面上为1,而语句“echo FALSE;”打印到页面上为空字符串。例如,程序rules4.php如下。
<?php
$a = 1;
$b = 1.02;
$c = TRUE;
$d = FALSE;
$e = NULL;
$f = "degree";
$g = $a.$f;
$h = $b.$f;
$i = $c.$f;
$j = $d.$f;
$k = $e.$f;
var_dump($g); //输出:string(7) "1degree"
echo "<br/>";
var_dump($h); //输出:string(10) "1.02degree"
echo "<br/>";
var_dump($i); //输出:string(7) "1degree"
echo "<br/>";
var_dump($j); //输出:string(6) "degree"
echo "<br/>";
var_dump($k); //输出:string(6) "degree"
?>
(5)在进行逻辑运算时,空字符串""、字符串"0"、整数0、浮点数0.0、NULL以及空数组将被转换为布尔型为FALSE,其他数据将被转换为布尔型TRUE(注意字符串"0.0"将被转换为布尔型TRUE)。例如,程序rules5.php如下。
<?php
$a = "";
$b = "0";
$c = "0.0";
$d = 0;
$e = 0.0;
$f = NULL;
$g = array();
$h = TRUE && $a;
$i = TRUE && $b;
$j = TRUE && $c;
$k = TRUE && $d;
$l = TRUE && $e;
$m = TRUE && $f;
$n = TRUE && $g;
var_dump($h); //输出:bool(false)
echo "<br/>";
var_dump($i); //输出:bool(false)
echo "<br/>";
var_dump($j); //输出:bool(true)
echo "<br/>";
var_dump($k); //输出:bool(false)
echo "<br/>";
var_dump($l); //输出:bool(false)
echo "<br/>";
var_dump($m); //输出:bool(false)
echo "<br/>";
var_dump($n); //输出:bool(false)
?>
3.5.2 强制类型转换
强制类型转换允许程序员手动将变量的数据类型转换成为指定的数据类型。PHP提供了以下3种强制类型转换方法。
(1)在要类型转换的变量或常量之前加上用括号括起来的目标数据类型。
(2)使用类型转换函数intval()、floatval()、strval()。
(3)使用通用类型转换函数settype()。
使用强制类型转换将浮点数转换为整数时,将自动舍弃小数部分,只保留整数部分;其他转换规则遵循自动转换的规则。
方法1 在变量前面加上一个小括号,并把目标数据类型填写在括号中。
这些目标数据类型包括:int、bool、float、string、array、object等。例如程序manual1.php如下。
<?php
$a = 11.2;
$b = (int)$a;
$c = (bool)$a;
$d = (float)$a;
$e = (array)$a;
$f = (object)$a;
$g = (string)$a;
var_dump($b); //输出:int(11)
echo "<br/>";
var_dump($c); //输出:bool(true)
echo "<br/>";
var_dump($d); //输出:float(11.2)
echo "<br/>";
var_dump($e); //输出:array(1) { [0]=> float(11.2) }
echo "<br/>";
var_dump($f); //输出:object(stdClass)#1 (1) { ["scalar"]=> float(11.2) }
echo "<br/>";
var_dump($g); //输出:string(4) "11.2"
?>
方法2 使用以val结尾的函数名的函数
如intval()、floatval() 、strval()函数,函数语法格式及功能如表3-9所示。例如,程序manual2.php如下。
<?php
$a = "123.9abc";
$b = intval($a);
$c = floatval($a);
$d = strval($a);
var_dump($b); //输出:int(123)
echo "<br/>";
var_dump($c); //输出:float(123.9)
echo "<br/>";
var_dump($d); //输出:string(8) "123.9abc"
?>
方法3 使用settype()函数
语法格式:bool settype ( mixed var, string type )
函数功能:设置变量var的数据类型为type数据类型,type的取值包括"bool"、"int"、"float"、"string"、"array"、"object"、"NULL"等字符串。函数如果执行成功则返回TRUE,否则返回 FALSE。例如,程序manual3.php如下。
和其他数据类型转换不同的是,使用 settype()函数设置变量数据类型时,变量本身的数据类型将发生变化。
<?php
$a = "123.9abc";
settype($a,"bool");
var_dump($a); //输出:bool(true)
echo "<br/>";
$b = "123.9abc";
settype($b,"int");
var_dump($b); //输出:int(123)
echo "<br/>";
$c = "123.9abc";
settype($c,"float");
var_dump($c); //输出:float(123.9)
echo "<br/>";
$d = "123.9abc";
settype($d,"string");
var_dump($d); //输出:string(8) "123.9abc"
echo "<br/>";
$e = "123.9abc";
settype($e,"array");
var_dump($e); //输出:array(1) { [0]=> string(8) "123.9abc" }
echo "<br/>";
$f = "123.9abc";
settype($f,"object");
var_dump($f); //输出:object(stdClass)#1 (1) { ["scalar"]=> string(8) "123.9abc" }
echo "<br/>";
$g = "123.9abc";
settype($g,"NULL");
var_dump($g); //输出:NULL
?>
共有条评论 网友评论