php是弱类型语言,用的时候不需要定义变量的类型,代码执行的时候zend虚拟机会根据相应的场景进行自动转换。比如:$a = "5" + 10,执行的时候,php zend引擎发现相加的一部分为字符串,则会试图将此字符串转为数值类型,然后再与后面的值相加。
除了自动类型转换,php还提供了一套强制的转换方式,平时开发的过程中经常有遇到的,如下:
(int)/(integer):转为整型
(bool)/(boolean):转为布尔类型
(float)/(double)/(real):转为浮点类型
(string):转为字符串
(array):转为数组
(object):转为对象
(unset):转为NULL
无论是自动类型转换还是强制类型转换,这些并非万能的,有些类型之间是无法转换的,比如无法将任何其他类型转为资源类型。
###### 以下是php中各类型之间相互转换的规则 ######
1、其他类型转换为NULL
这类转换比较简单,任何类型都可以转为NULL,转换时直接将zval(PHP底层C中定义变量的变量)类型设置为IS_NULL。
2、其他类型转为布尔类型boolean
当转为布尔类型的时候,根据原值的true、false决定转换后的结果。比如资源类型、对象转为true,而以下值会被认为是false:
布尔值false本身;
整数0;
浮点型0.0;
字符串"0";
空字符串(非空格),如:""、'';
NULL;
3、其他类型转为整型
NULL:转为0;
布尔型:false转为0,true转为1;
浮点型:向下取整,比如(int)1.9=>1;
字符串:如果字符串以合法的数值开始,则使用该数值,否则为0,合法的数值由可选的正负号,后面跟一个或多个数字,可能有小数点,再跟可选的指数部分组成;
数组:很多操作不支持将一个数组转为整型,如array()+2,将报error错误,但是可以强制把数组转为整型,非空数组转为1,空数组转为0;
对象:与数组类似,很多操作不支持将对象自动转为整型,但有些操作只会报一个warning警告,还是会把对象转为1操作,这个需要看不同的处理情况和场景;
资源:转为分配给这个资源的唯一编号;
4、其他类型转为浮点型
除了字符串类型外,其他类型转换规则与整型基本一致,只是在整型转换结果上加了一个小数位。
5、其他类型转为字符串
一个值可以通过在其前面加上(string)或者用strval()函数来转变成字符串。在一个需要字符串的表达式中,会自动转为string,比如在使用函数echo或者print时,或在一个非string类型的变量和一个string类型变量进行比较的时候,就会发生这种转换。以下是具体转换规则:
NULL/FALSE:转为空字符串;
TRUE:转为“1”;
整型:原样转为字符串,转换时将各位依次除10取余数;
浮点型:原样转为字符串;
数组:转为“Array”,会报Notice错误;
对象:不能转换,将报错;
资源:转为“Resource id #xxx”;
6、其他类型转为数组
如果将一个null、integer、float、string、boolean、resource类型转为数组,则将得到一个仅有一个元素的数组,其下标为0,该元素为此标量的值。换句话说,(array)$a相当于array($a)。
如果将一个object类型转为array,则结果为一个数组,数组元素为该对象的全部属性,包括public、private、protected,其中private的属性转换后的key加上了该类名的前缀,protected属性的key加上了“*”作为前缀,但这个前缀并不是转为数组的时候单独加上的,而是类编译生成属性就已经加上了,也就是说,这其实是成员属性本身的一个特点,举例来看:
class rui{ private $a = 123; public $b = 456; protected $c = 'abc'; public function dai() { echo '666'; } } $obj = new rui(); print_r( (array)$obj );
输出:
Array ( [ruia] => 123 [b] => 456 [*c] => abc )
其实前缀的前后还包含一些特殊字符,如下图所示:
7、其他类型转换为对象
其他任何类型的值被转换为对象,将会创建一个内置类stdClass的实例:
如果该值为NULL,则新的实例为空;
array转为object将以键名成为属性名并具有相对应的值,数值索引的元素也将转为属性,但是无法通过“->”访问,只能遍历获取;
对于其他值,会以“scalar”作为属性名。