一、简介PHP数据类型的转换
类型转换是指将变量或值从一种数据类型转换成其他数据类型。
由于每一个数据都有它的类型,具有相同类型的数据才能彼此操作。PHP 在变量定义中不需要(或不支持)明确的类型定义,变量类型是根据使用该变量的上下文所决定的。所以一种转换方式就是自动转换,另一种是强制转换。
二、PHP自动数据类型转换
通常只有四种标量类型(integer、float、string、boolean)和 NULL 才会在运算中自动转换类型。
自动类型转换并不会改变变量本身的类型,改变的仅是这些变量的求值方式。自动类型转换虽然是由系统自动完成的,但在混合运算时,自动类型转换也需要遵循按数据长度增加的方向进行,以保证精度不降低
- 有布尔型值参与运算时,TRUE 将转化为整型 1,FALSE 将转化为整型 0,然后再参与运算。
- 有 NULL 值参与运算时,NULL 值将转化为整型 0 后再进行运算。
- 有 integer 类型和 float 类型的值参与运算时,会先把 integer 型的值转成 float 类型后再进行运算。
- 有字符串和数字型(integer、float)的值参与运算时,字符串类型会先转换为数字,再参与运算。转化后的数字是从字符串开始的数值型字符串,如在字符串开始的数值型字符串不带小数点则转为 integer 类型的值。如果带有小数点则转为 float 类型的值,例如:字符串“123ab”转为整数 123,字符串“123.45ab”转为浮点数 123.45,字符串“abc”转为整数 0。
三、PHP强制数据类型转换
PHP 中的类型强制转换大体分为三种方式、分别是在要转换的变量之前加上用括号括起来的目标类型(例如$var = (int)3.1415;
),也可以使用具体的类型转换函数(例如 intval()、floatval()、strval() 等)或者 settype() 来转换类型。
在要转换的变量之前加上用括号括起来的目标类型
(int)、(integer):转换成整形
(float)、(double)、(real):转换成浮点型
(string):转换成字符串
(bool)、(boolean):转换成布尔类型
(array):转换成数组
(object):转换成对象
(unset) :转换为 NULL
(unset) 转换在 PHP 7.2.0 中已被废弃。请注意 (unset) 转换等于将值赋予 NULL。(unset) 转换已经在 PHP 8.0.0 中被移除。
使用转换函数实现PHP类型转换
intval():用于获取变量的整数值;
floatval():用于获取变量的浮点值;
boolval():用于获取变量的布尔值;
strval():用于获取变量的字符串值。
使用 settype() 函数实现PHP类型转换
上面介绍的两种强制类型转换的方式都不会改变被转换变量本身的类型,而是通过将转换得到的新类型的数据赋值给新的变量,原变量的类型和值不变。如果需要改变变量本身的类型可以使用 settype() 函数来完成。
说明:
settype(mixed &$var, string $type)
参数:
- var 要转换的变量。
- type 的可能值为:
- “boolean” (或为“bool”,从 PHP 4.2.0 起)
- “integer” (或为“int”,从 PHP 4.2.0 起)
- “float” (只在 PHP 4.2.0 之后可以使用,对于旧版本中使用的“double”现已停用)
- “string”
- “array”
- “object”
- “null” (从 PHP 4.2.0 起)
返回:
成功时返回 true
, 或者在失败时返回 false
。
<?php
$str = 'abc';
$bool = true;
settype($str, 'integer');
settype($bool, 'string');
var_dump($str,$bool);
echo '<br/>';
echo gettype($str);
echo '<br/>';
echo gettype($bool);
gettype 确定变量的类型并且返回一个包含名称的字符串。
四、PHP数据类型转换细节
转换为Boolean 布尔类型
当转换为 boolean 时,以下值被认为是 false:
- 布尔值 false 本身。
- 整型值 0、-0 。
- 浮点型值 0.0、-0.0。
- 空字符串、字符串 “0”。
- 不包括任何元素的数组
- 特殊类型 NULL、尚未赋值的变量
所有其它值都被认为是 true
( 包括NAN
)。
转换为整型 int
-
从布尔转换:
false
将转换为 0,true
将转换为 1。 -
当从浮点数 float 转换成整数 int 时,将向下取整,就是自动舍弃小数部分,只保留整数部分。如果一个浮点数超过整型数字的有效范围,其结果将是不确定的。
-
NaN 和 Infinity 在转换成 int 时是零。
-
绝不要将未知的分数强制转换为 int,这样有时会导致不可预料的结果。
<?php echo (int) ( (0.1+0.7) * 10 ); // 显示 7!
-
从字符串转换:当字符串转换为数字时,转换后的数字是从字符串开始部分的数值型字符串,数值型字符串包括用科学计数法表示的数字。
<?php $foo = (int)'1.5'; $foo2 = (int)'a1.5'; $foo3 = (int)'1.5a'; $foo4 = (int)'-1.0e3'; $foo5 = (int)'-1.0e3a'; $foo6 = (int)'100 Small Pigs'; var_dump($foo,$foo2,$foo3,$foo4,$foo5,$foo6); // 运行结果为:int(1) int(0) int(1) int(-1000) int(-1000) int(100)
-
NULL会转换为零 0。
-
从其它类型转换:没有定义从其它类型转换为 int 的行为。不要依赖任何现有的行为,因为它会未加通知地改变。
转换为浮点数 float
-
整数转换为浮点型,由于浮点型的精度范围远大于整型,所以转换后的精度不会改变。
-
当字符串转换为数字时,转换后的数字是从字符串开始部分的数值型字符串,数值型字符串包括用科学计数法表示的数字。
<?php $foo = (float)'1.5'; $foo2 = (float)'a1.5'; $foo3 = (float)'1.5a'; $foo4 = (float)'-1.0e3'; $foo5 = (float)'-1.0e3a'; $foo6 = (float)'100 Small Pigs'; var_dump($foo,$foo2,$foo3,$foo4,$foo5,$foo6); // 运行结果为:float(1.5) float(0) float(1.5) float(-1000) float(-1000) float(100)
-
对于其它类型的值,其情况类似于先将值转换成 int,然后再转换成 float。
转换为字符串string
-
字符串的转换除了上面三种方式外在使用函数
echo
或print
时,或在一个变量和一个 string 进行比较时,也会发生这种转换。 -
从布尔转换:true 被转换成
"1"
,false 被转换成""
(空字符串)。这种转换可以在 bool 和 string 之间相互进行。 -
一个整数 int 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)。使用指数计数法的浮点数(
1.2E+3
)也可转换。 -
数组 array 总是转换成字符串
"Array"
。 -
必须使用魔术方法
__toString
才能将 object 转换为 string。<?php // 创建测试类 class TestClass { public function __toString() { return '对象转字符串时候,调用次魔术方法,必须返回一个字符串,否则将发出一条 E_RECOVERABLE_ERROR 级别的致命错误'; } } $class = new TestClass('Hello'); echo $class;
-
资源 Resource 总会被转变成
"Resource id #1"
这种结构的字符串,其中的1
是 PHP 在运行时分配给该 resource 的资源数字。 -
NULL总是被转变成空字符串
""
。 -
正如上面看到的,直接把 array,object 或 resource 转换成 string 不会得到除了其类型之外的任何有用信息。
大部分的 PHP 值可以转变成 string 来永久保存,这被称作串行化,可以用函数 serialize()返回字符串,此函数 可处理除了 resource 之外的任何类型。有利于存储或传递 PHP 的值,同时不丢失其类型和结构。在利用unserialize()恢复类型和结构。
serialize()
<?php $testArr=['函数 serialize()']; $str=serialize($testArr); var_dump($str); $recoverTestArr=unserialize($str); var_dump($recoverTestArr);
转换为数组 array
-
对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。
<?php $intArr = (array)123; $floatArr = (array)12.3; $strArr = (array)'123'; $boolArr = (array)true; var_dump($intArr,$floatArr,$strArr,$boolArr); // 运行结果 array(1) { [0]=> int(123) } array(1) { [0]=> float(12.3) } array(1) { [0]=> string(3) "123" } array(1) { [0]=> bool(true) } // 等同于 $intArr = array(123); $floatArr = array(12.3); // ... //(array)$scalarValue 与 array($scalarValue) 一样。
-
如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 ‘*’ 做前缀。这些前缀的前后都各有一个 NULL 字符。这会导致一些不可预知的行为。
<?php class A { private $A; // '\0A\0A' } class B extends A { private $A; // '\0B\0A' public $AA; // 'AA' } var_dump((array) new B()); // 结果为 array(3) { ["BA"]=> NULL ["AA"]=> NULL ["AA"]=> NULL } // 上例会有两个键名为 'AA',不过其中一个实际上是 '\0A\0A'。
-
将
null
转换为 array 会得到一个空的数组。
转换为对象object
- 如果其它任何类型的值被转换成对象,将会创建一个内置类
stdClass
的实例。如果该值为null
,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值。
转换为资源 resource
- 将其它类型的值转换为资源没有意义。
转换为NULL
-
使用
(unset) $var
将一个变量转换为 null 将不会删除该变量或 unset 其值。仅是返回null
值而已。(unset) 转换在 PHP 7.2.0 中已被废弃。请注意 (unset) 转换等于将值赋予 NULL。(unset) 转换已经在 PHP 8.0.0 中被移除。
五、检测PHP数据类型的函数
- is_array()- 检测变量是否是数组
- is_bool()- 检测变量是否是布尔值
- is_callable() - 检测参数是否为合法的可调用结构
- is_float() - 检测变量是否是浮点型
- is_int() - 检测变量是否是整数
- is_null()- 检测变量是否为 null
- is_numeric() - 检测变量是否为数字或数字字符串
- is_object() - 检测变量是否是一个对象
- is_resource()- 检测变量是否为资源类型
- is_scalar() - 检测变量是否是一个标量
- is_string()- 检测变量是否是字符串
六、提示
(。◕ˇ∀ˇ◕)遇见就是缘分,如果觉得对自己有帮助,喜欢的可以收藏或者留下一个赞,谢谢支持。
关注我编程不迷路。