现在的位置: 首页 -> PHP学习 -> php中各数据类型之间的转换规则

php中各数据类型之间的转换规则

2018-04-17 00:06评论数 0 ⁄ 被浏览 12297 views+

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
)


其实前缀的前后还包含一些特殊字符,如下图所示:


微信截图_20180416233140


7、其他类型转换为对象


其他任何类型的值被转换为对象,将会创建一个内置类stdClass的实例:

  • 如果该值为NULL,则新的实例为空;

  • array转为object将以键名成为属性名并具有相对应的值,数值索引的元素也将转为属性,但是无法通过“->”访问,只能遍历获取;

  • 对于其他值,会以“scalar”作为属性名。


 

文章出自:https://www.daixiaorui.com/read/266.html 本站所有文章,除注明出处外皆为原创,转载请注明本文地址,版权所有。

目前有 0 条评论  @我要评论

    您的每一个评论都是对我的一份支持

     博客二维码

    昵称 *

    邮箱 *