本章主要内容来源于秦朋先生编著的《PHP7内核剖析》这本书籍,感兴趣的小伙伴可以购买该书,进行系统性学习。

概述


PHP是弱类型语言,使用时不需要明确定义变量的类型,Zend虚拟机在执行PHP代码时会根据具体的应用场景进行转换,也就是变量会按照类型转换的规则将不合格的变量转为合格的变量,然后进行操作。除了自动类型转换,PHP还提供了一种强制类型转换方式。

转换为布尔型


转换为布尔型时,根据原值的true、false决定转换后的结果,以下值被认为是false,除了下面这些情况,其他值通常被认为是true。

  • 布尔值false本身
  • 整型值0
  • 浮点型值0.0
  • 空字符串以及字符串”0”
  • 空数组
  • NULL

转换为整型


从其他类型转为整型的规则。

  • NULL:转为0
  • 布尔型:false转为0,true转为1
  • 浮点型:向下取整
  • 字符串型:如果字符串以合法的数值开始,则使用该数值,否则,其值为0。
  • 数组:很多操作不支持讲一个数组自动转为整型处理,比如array()+2,将报一个error错误,但可以强制把数组转为整型,非空数组转为1,空数组转为0。
  • 对象:与数组类似,很多操作也不支持将对象自动转为整型,但有些操作只会抛一个warning警告,还是会把对象转1操作,这个需要看不同操作的处理情况。
  • 资源:转为分配给这个资源的唯一编号。

转换为浮点型


除了字符串类型外,其他类型转换规则与整型基本一致,只是在整型转换结果上加了一个小数点。

转换为字符串


  • NULL/FALSE:转为空字符串
  • TRUE:转为”1”
  • 整型:原样转为字符串,转换时将各位依次除10取余
  • 浮点型:原样转为字符串
  • 资源:转为“Resource id #xxx”
  • 数组:转为“Array”,报Notice
  • 对象:不能转换,报错

转换为数组


如果将一个null、integer、float、string、booean和resource类型的值转换为数组,则将得到一个仅有一个元素的数组,其下标为0,该元素为此标量的值。

如果一个object类型转换为array,则结果是一个数组,数组元素为该对象的全部属性,其中private的属性转换后的key加上了类名作为前缀,protected属性的key加上了“*”作为前缀。

转换为对象


任何类型的值被转换为对象,将会创建一个内置类stdCass的实例:如果该值为NULL,则新的实例为空;array转换成object将以键名成为属性名并具有相对应的值,数值索引的元素也将转为属性,但是无法通过”->”访问,只能遍历获取;对于其他值,会以“scalar”作为属性名。