2.3 探讨数据类型之间的转换
数据类型之间的转换
通过上一节的介绍,我们已经对PHP中的各种数据类型有了一定的了解。在此基础上,我们还需要掌握关于数据类型的另一个重要应用——数据类型转换。
2.3.1 PHP与众不同的类型转换
绝大多数编程语言(如C语言、Java语言)在声明变量的时候,必须明确指定变量的数据类型,并且一旦指定了某一变量的数据类型,该变量就只能存储这一种类型的数据了。PHP在数据类型的定义方面与其他编程语言有所区别。下面我们通过两个小例子来比较一下PHP与其他语言在定义数据类型时的不同之处。
1.例子1
在Java语言中,我们定义两个变量,如下面代码所示:
String a="Hello!"; //定义一个String类型的变量a int b=11; //定义一个int类型的变量b
而在PHP语言中,这两个变量的定义格式如下面代码所示:
$a="Hello"; //定义一个变量a $b=11; //定义一个变量b
比较上面两段代码不难发现,同样是定义两个变量,在Java语言中我们需要为变量指定数据类型,而在PHP语言中我们并不需要为变量指定任何数据类型。
Note
在定义变量时,不为变量指定任何数据类型的做法在很多编程语言中是不允许的,但是在PHP语言中则不会出现任何问题。
2.例子2
在PHP中我们还可以如下面代码所示一样使用变量;
$a="Hello"; //定义一个变量a,并将字符串“Hello”赋给a $a=11; //将数字11赋给a
在上面代码中,当字符串“Hello”赋值给变量a时,变量a成为一个字符串类型的变量;而当数字11赋值给变量a时,变量a成为一个整型的变量。
正是因为PHP语言类型转换的特殊性,决定了我们能够随心所欲地定义和使用变量。PHP中的类型转换包含两种方式:自动类型转换和强制类型转换。下面分别介绍这两种类型转换方式的实现及应用过程。
2.3.2 自动类型转换
自动类型转换是指定义变量时不需要指定变量的数据类型,PHP会根据具体引用变量的具体应用环境,将变量转换为合适的数据类型。在对变量进行赋值操作的时候,经常会用到自动类型转换。自动类型转换主要包括如下两种方式。
1.直接对变量的赋值操作
直接对变量的赋值操作是自动类型转换最简单的应用,变量的数据类型由赋予的值决定。也就是说,当把一个字符串类型的数据赋值给变量时,该变量就是一个字符串类型的变量;当把一个整型数据赋值给变量时,该变量就是一个整型的变量。实际上,2.3.1节的例子2应用的就是自动类型转换。由于这种方式的自动类型转换比较简单,这里就不再给出示例程序了。
2.运算式结果对变量的赋值操作
自动类型转换的第二种应用方式是将一个运算式的结果赋值给一个变量。这种自动类型转换方式又可分为以下两种情况。
1)运算数为同一数据类型
这种情况处理起来比较简单,由于参与运算的所有运算数都是同一数据类型,所以被赋值的变量也属于这种类型。例如下面给出的代码:
$a = 1.23232; $b = 2.23; $c = $a + $b;
变量a与变量b都是浮点型变量,这两个变量进行相加运算并将运算结果赋值给变量c,那么这时候,变量c就成为了一个浮点型变量。
2)运算数为不同数据类型
如果所有运算数都是数字,将选取占用字节最长的一种运算数的数据类型作为基准数据类型;如果运算数为字符串,将该字符串转型为数字然后再进行求值运算。字符串转换为数字的规定为:如果字符串以数字开头,只取数字部分而去除数字后面部分,根据数字部分构成决定转型为整型数据还是浮点型数据;如果字符串以字母开头,直接将字符串转换为零。例如下面给出的代码:
$a = 1 + 1.23; $b = 2 + "3.14"; $c = 3 + "abc";
● 在第1个赋值运算式中,运算数包含了整型数字1和浮点型数字1.23,根据规定取浮点型数据类型作为基准数据类型。赋值后变量a的数据类型为浮点型。
● 在第2个赋值运算式中,运算数包含了整型数字2和字符串型数据“3.14”,首先将字符串转换为浮点型数据3.14,然后再进行加法运算。赋值后变量b的数据类型为浮点型。
● 在第3个赋值运算式中,运算数包含了整型数字3和字符串型数据“abc”,首先将字符串转换为整型数字0,然后再进行加法运算。赋值后变量c的数据类型为整型。
2.3.3 强制类型转换
强制类型转换允许我们手动将变量的数据类型转换成为指定的数据类型。PHP强制类型转换与C语言或者Java语言中的类型转换相似,都是通过在变量前面加上一个小括号,并把目标数据类型填写在小括号中实现的。
在PHP中强制类型转换的具体实现方式如表2-2所示。
表2-2 PHP强制类型转换的实现方式
虽然PHP提供了比较宽泛的类型转换机制,为开发者提供了很大便利,但同时也存在着一些问题,比如,将字符串型数据转换为整型数据该如何转换,将整型数据转换为布尔型数据该如何转换等。如果没有对上述类似的情形做出明确规定,那么在处理类型转换问题时肯定变得一片混乱。不过幸好PHP为我们提供了相关的转换规定。
1.其他数据类型转换为整型的规定(如表2-3所示)
表2-3 其他数据类型转换为整型
将其他数据类型转换为整型的示例代码如下所示:
代码2-8光盘\codes\第2章\2.3\toInt.php
<?php $a="123"; //定义一个内容为纯数字的字符串型变量a $b="123sunyang"; //定义一个数字开头的字符串型变量b $c="2.32"; //定义一个内容为小数的字符串型变量c $d="2.32abc"; //定义一个以小数开头的字符串型变量d $e="sunyang123"; //定义一个非数字开头的字符串型变量e $f=TRUE; //定义一个值为TRUE的布尔型变量f $g=FALSE; //定义一个值为FALSE的布尔型变量g $h="3.1415926"; //定义一个浮点型变量h echo (int)$a."<br>"; echo (int)$b."<br>"; echo (int)$c."<br>"; echo (int)$d."<br>"; echo (int)$e."<br>"; echo (int)$f."<br>"; echo (int)$g."<br>"; echo (int)$h."<br>"; ?>
该程序被执行时,得到结果如图2-8所示。
图2-8 其他数据类型转换为整型
Note
浮点型数据向整型数据进行转换的时候,可能会出现精度损失的现象。如果需要高精度的运算结果,就不能采取这种强制类型转换的方式。
2.其他数据类型转换为浮点型的规定(如表2-4所示)
表2-4 其他数据类型转换为浮点型
将其他数据类型转换为浮点型的示例代码如下所示:
代码2-9光盘\codes\第2章\2.3\toFloat.php
<?php $a="123"; //定义一个内容为纯数字的字符串型变量a $b="123sunyang"; //定义一个数字开头的字符串型变量b $c="2.32abc"; //定义一个以小数开头的字符串型变量c $d="sunyang123"; //定义一个非数字开头的字符串型变量d $e=TRUE; //定义一个值为TRUE的布尔型变量e $f=FALSE; //定义一个值为FALSE的布尔型变量f $g=1234; //定义一个整型变量g echo (float)$a."<br>"; echo (float)$b."<br>"; echo (float)$c."<br>"; echo (float)$d."<br>"; echo (float)$e."<br>"; echo (float)$f."<br>"; echo (float)$g."<br>"; ?>
该程序被执行时,得到结果如图2-9所示。
图2-9 其他数据类型转换为浮点型
3.其他数据类型转换为布尔型的规定(如表2-5所示)
表2-5 其他数据类型转换为布尔型
将其他数据类型转换为布尔型的示例代码如下所示:
代码2-10光盘\codes\第2章\2.3\toBoolean.php
<?php $a=0; //定义一个值为零的整型变量a $b=123; //定义一个非零整型变量b $c=0.0; //定义一个值为零的浮点型变量c $d=3.14; //定义一个非零浮点型变量d $e=""; //定义一个空字符串型变量e $f="0"; //定义一个内容为零的字符串型变量f $g="TRUE"; //定义一个非空字符串型变量g $h=array(); //定义一个空数组h $i=array("a","b","c"); //定义一个非空数组i $j=NULL; //定义一个NULL型的变量j echo var_dump((boolean)$a)."<br>"; echo var_dump((boolean)$b)."<br>"; echo var_dump((boolean)$c)."<br>"; echo var_dump((boolean)$d)."<br>"; echo var_dump((boolean)$e)."<br>"; echo var_dump((boolean)$f)."<br>"; echo var_dump((boolean)$g)."<br>"; echo var_dump((boolean)$h)."<br>"; echo var_dump((boolean)$i)."<br>"; echo var_dump((boolean)$j)."<br>"; ?>
该程序被执行时,得到结果如图2-10所示。
图2-10 其他数据类型转换为布尔型
Note
由于PHP语言中布尔值为“FALSE”的变量无法明显打印出来,所以本例中使用了var_dump()函数获取变量的信息并显示在页面中。
4.其他数据类型转换为字符串的规定(如表2-6所示)
表2-6 其他数据类型转换为字符串
将其他数据类型转换为字符串的示例代码如下所示:
代码2-11光盘\codes\第2章\2.3\toString.php
<?php $a=123; //定义一个整型变量a $b=3.14; //定义一个浮点型变量b $c=TRUE; //定义一个值为TRUE的布尔型变量c $d=FALSE; //定义一个值为FALSE的布尔型变量d $e=array("abc"); //定义一个数组e $f=NULL; //定义一个NULL型变量f echo (string)$a."<br>"; echo (string)$b."<br>"; echo (string)$c."<br>"; echo (string)$d."这里显示为空字符串<br>"; echo (string)$e."<br>"; echo (string)$f."这里显示为空字符串<br>"; ?>
该程序被执行时,得到结果如图2-11所示。
图2-11 其他数据类型转换为字符串
5.其他数据类型转换为数组的规定(如表2-7所示)
表2-7 其他数据类型转换为数组
将其他数据类型转换为数组的示例代码如下所示:
代码2-12光盘\codes\第2章\2.3\toArray.php
<?php $a=123; //定义一个整型变量a $b=3.14; //定义一个浮点型变量b $c=TRUE; //定义一个布尔型变量c $d="Hello"; //定义一个字符串型变量d class A{ //定义一个类A,包含3个不同属性的成员变量 private $private; public $public; protected $protected; } $f=new A(); //实例化一个A的对象f $g=NULL; //定义一个NULL类型的变量g echo var_dump((array)$a)."<br>"; echo var_dump((array)$b)."<br>"; echo var_dump((array)$c)."<br>"; echo var_dump((array)$d)."<br>"; echo var_dump((array)$f)."<br>"; echo var_dump((array)$g); ?>
该程序被执行时,得到结果如图2-12所示。
图2-12 其他数据类型转换为数组
6.其他数据类型转换为对象的规定(如表2-8所示)
表2-8 其他数据类型转换为对象
将其他数据类型转换为对象的示例代码如下所示:
代码2-13光盘\codes\第2章\2.3\toObject.php
<?php $a=(object)123; //将整型数据转型为对象并赋给变量a $b=(object)3.14; //将浮点型数据转型为对象并赋给变量b $c=(object)TRUE; //将布尔型数据转型为对象并赋给变量c $d=(object)"Hello"; //将字符串转型为对象并赋给变量d $e=(object)NULL; //将NULL转型为对象并赋给变量e $f=(object)array("a"=>aaa,"b"=>bbb,"c"=>ccc); //将一个数组转型为对象并赋给变量f echo $a->scalar."<br>"; echo $b->scalar."<br>"; echo $c->scalar."<br>"; echo $d->scalar."<br>"; echo $e->scalar."<br>"; echo$f->b."<br>"; //输出对象f中成员变量b的值 ?>
该程序被执行时,得到结果如图2-13所示。
图2-13 其他数据类型转换为对象