转换
一般
显式类型转换使用 强制转换运算符 执行。如果操作或语言结构需要一种类型的操作数,而给定的是另一种类型的操作数,则会执行隐式(自动)转换。大多数内部函数也是如此,但一些函数在参数类型不同时可能会执行不同的操作,因此不会执行转换。
如果表达式转换为其自身的类型,则结果的类型和值与表达式的类型和值相同。
无法执行转换为resource
和null
类型的转换。
转换为布尔类型
如果源类型是int
或float
,那么如果源值测试等于 0,则结果值为FALSE
;否则,结果值为TRUE
。
如果源值为NULL
,则结果值为FALSE
。
如果源是空字符串或字符串“0”,则结果值为FALSE
;否则,结果值为TRUE
。
如果源是包含零个元素的数组,则结果值为FALSE
;否则,结果值为TRUE
。
如果源是对象,则结果值为TRUE
。
如果源是资源,则结果值为TRUE
。
库函数 boolval
允许将值转换为bool
。
转换为整数类型
如果源类型是bool
,那么如果源值为FALSE
,则结果值为 0;否则,结果值为 1。
如果源类型是float
,对于值INF
、-INF
和NAN
,结果值为零。对于所有其他值,如果可以保留精度(即浮点数在整数范围内),则小数部分将向零取整。如果精度无法保留,则使用以下转换算法,其中X定义为 2 的整数位数的次方(例如,2 的 32 次方,即 4294967296)
- 我们将浮点数除以X(其中余数与被除数具有相同的符号)的余数向零取整。
- 如果余数小于零,则将其向无穷大取整,并将X加到它。
- 将此结果转换为无符号整数。
- 将此结果转换为有符号整数,方法是将无符号整数视为有符号整数的二进制补码表示。
只要结果相同,实现就可以用不同的方式实现此转换(例如,在某些架构上可能存在对这种特定转换模式的硬件支持)。
如果源值为NULL
,则结果值为 0。
如果源是 数字字符串或前导数字字符串,并且具有整数格式,如果可以保留精度,则结果值为该字符串的整数值;否则,结果未定义。如果源是具有浮点格式的数字字符串或前导数字字符串,则字符串的浮点值将按照上述从float
转换的描述进行处理。前导数字字符串中的尾随非数字字符将被忽略。对于任何其他字符串,结果值为 0。
如果源是包含零个元素的数组,则结果值为 0;否则,结果值为 1。
如果源是对象,如果类定义了转换函数,则结果由该函数确定(目前仅适用于内部类)。如果没有,则转换无效,结果假定为 1,并且会产生非致命错误。
如果源是资源,则结果是资源的唯一 ID。
库函数 intval
允许将值转换为int
。
转换为浮点类型
如果源类型是int
,如果可以保留精度,则结果值为最接近源值的近似值;否则,结果未定义。
如果源是 数字字符串或前导数字字符串,并且具有整数格式,则字符串的整数值将按照上述从int
转换的描述进行处理。如果源是具有浮点格式的数字字符串或前导数字字符串,则结果值为最接近该字符串的浮点值的近似值。前导数字字符串中的尾随非数字字符将被忽略。对于任何其他字符串,结果值为 0。
如果源是对象,如果类定义了转换函数,则结果由该函数确定(目前仅适用于内部类)。如果没有,则转换无效,结果假定为 1.0,并且会产生非致命错误。
对于所有其他类型的源,通过首先 将源值转换为int
,然后转换为float
来获得转换结果。
库函数 floatval
允许将值转换为 float。
转换为字符串类型
如果源类型是bool
,那么如果源值为FALSE
,则结果值为空字符串;否则,结果值为“1”。
如果源类型是int
或float
,则结果值为包含源值文本表示形式的字符串(如库函数 sprintf
所指定)。
如果源值为NULL
,则结果值为空字符串。
如果源是数组,则转换无效。结果值为字符串“Array”,并会产生非致命错误。
如果源是对象,那么如果该对象的类具有 __toString
方法,则结果值为该方法返回的字符串;否则,转换无效,并会产生致命错误。
如果源是资源,则结果值为实现定义的字符串。
库函数 strval
允许将值转换为字符串。
转换为数组类型
如果源值为NULL
,则结果值为包含零个元素的数组。
如果源类型是标量或resource
并且它是非NULL
,则结果值为一个包含一个元素的数组,该元素在键 0 下,其值为源的值。
如果源是对象,则结果是包含零个或多个元素的 数组,其中元素是对应于 对象 的实例属性的键值对。将元素插入数组的顺序是在 class-member-declarations 列表中实例属性的词法顺序。
对于公共实例属性,数组元素的键将与属性名称相同。
私有实例属性的键具有以下形式:“\0class\0name”,其中class是类名,而name是属性名称。
受保护实例属性的键具有以下形式:“\0*\0name”,其中name是该属性的名称。
每个键的值是来自相应属性的值,或者如果属性未初始化,则为NULL
。
转换为对象类型
如果源的类型不是对象,则结果是预定义类 stdClass
的实例。如果源的值为NULL
,则实例为空。如果源的值具有标量类型并且是非NULL
,或者它是一个resource
,则该实例包含一个名为scalar
的公共属性,其值为源的值。如果源的值是数组,则该实例包含一组公共属性,其名称和值是源中对应键值对的名称和值。属性的顺序是源元素插入的顺序。