转换

一般

显式类型转换使用 强制转换运算符 执行。如果操作或语言结构需要一种类型的操作数,而给定的是另一种类型的操作数,则会执行隐式(自动)转换。大多数内部函数也是如此,但一些函数在参数类型不同时可能会执行不同的操作,因此不会执行转换。

如果表达式转换为其自身的类型,则结果的类型和值与表达式的类型和值相同。

无法执行转换为resourcenull类型的转换。

转换为布尔类型

结果类型bool

如果源类型是intfloat,那么如果源值测试等于 0,则结果值为FALSE;否则,结果值为TRUE

如果源值为NULL,则结果值为FALSE

如果源是空字符串或字符串“0”,则结果值为FALSE;否则,结果值为TRUE

如果源是包含零个元素的数组,则结果值为FALSE;否则,结果值为TRUE

如果源是对象,则结果值为TRUE

如果源是资源,则结果值为TRUE

库函数 boolval 允许将值转换为bool

转换为整数类型

结果类型int

如果源类型是bool,那么如果源值为FALSE,则结果值为 0;否则,结果值为 1。

如果源类型是float,对于值INF-INFNAN,结果值为零。对于所有其他值,如果可以保留精度(即浮点数在整数范围内),则小数部分将向零取整。如果精度无法保留,则使用以下转换算法,其中X定义为 2 的整数位数的次方(例如,2 的 32 次方,即 4294967296)

  1. 我们将浮点数除以X(其中余数与被除数具有相同的符号)的余数向零取整。
  2. 如果余数小于零,则将其向无穷大取整,并将X加到它。
  3. 将此结果转换为无符号整数。
  4. 将此结果转换为有符号整数,方法是将无符号整数视为有符号整数的二进制补码表示。

只要结果相同,实现就可以用不同的方式实现此转换(例如,在某些架构上可能存在对这种特定转换模式的硬件支持)。

如果源值为NULL,则结果值为 0。

如果源是 数字字符串或前导数字字符串,并且具有整数格式,如果可以保留精度,则结果值为该字符串的整数值;否则,结果未定义。如果源是具有浮点格式的数字字符串或前导数字字符串,则字符串的浮点值将按照上述从float转换的描述进行处理。前导数字字符串中的尾随非数字字符将被忽略。对于任何其他字符串,结果值为 0。

如果源是包含零个元素的数组,则结果值为 0;否则,结果值为 1。

如果源是对象,如果类定义了转换函数,则结果由该函数确定(目前仅适用于内部类)。如果没有,则转换无效,结果假定为 1,并且会产生非致命错误。

如果源是资源,则结果是资源的唯一 ID。

库函数 intval 允许将值转换为int

转换为浮点类型

结果类型float

如果源类型是int,如果可以保留精度,则结果值为最接近源值的近似值;否则,结果未定义。

如果源是 数字字符串或前导数字字符串,并且具有整数格式,则字符串的整数值将按照上述从int转换的描述进行处理。如果源是具有浮点格式的数字字符串或前导数字字符串,则结果值为最接近该字符串的浮点值的近似值。前导数字字符串中的尾随非数字字符将被忽略。对于任何其他字符串,结果值为 0。

如果源是对象,如果类定义了转换函数,则结果由该函数确定(目前仅适用于内部类)。如果没有,则转换无效,结果假定为 1.0,并且会产生非致命错误。

对于所有其他类型的源,通过首先 将源值转换为int,然后转换为float来获得转换结果。

库函数 floatval 允许将值转换为 float。

转换为字符串类型

结果类型string

如果源类型是bool,那么如果源值为FALSE,则结果值为空字符串;否则,结果值为“1”。

如果源类型是intfloat,则结果值为包含源值文本表示形式的字符串(如库函数 sprintf 所指定)。

如果源值为NULL,则结果值为空字符串。

如果源是数组,则转换无效。结果值为字符串“Array”,并会产生非致命错误。

如果源是对象,那么如果该对象的类具有 __toString 方法,则结果值为该方法返回的字符串;否则,转换无效,并会产生致命错误。

如果源是资源,则结果值为实现定义的字符串。

库函数 strval 允许将值转换为字符串。

转换为数组类型

结果类型array

如果源值为NULL,则结果值为包含零个元素的数组。

如果源类型是标量或resource并且它是非NULL,则结果值为一个包含一个元素的数组,该元素在键 0 下,其值为源的值。

如果源是对象,则结果是包含零个或多个元素的 数组,其中元素是对应于 对象 的实例属性的键值对。将元素插入数组的顺序是在 class-member-declarations 列表中实例属性的词法顺序。

对于公共实例属性,数组元素的键将与属性名称相同。

私有实例属性的键具有以下形式:“\0class\0name”,其中class是类名,而name是属性名称。

受保护实例属性的键具有以下形式:“\0*\0name”,其中name是该属性的名称。

每个键的值是来自相应属性的值,或者如果属性未初始化,则为NULL

转换为对象类型

结果类型object

如果源的类型不是对象,则结果是预定义类 stdClass 的实例。如果源的值为NULL,则实例为空。如果源的值具有标量类型并且是非NULL,或者它是一个resource,则该实例包含一个名为scalar的公共属性,其值为源的值。如果源的值是数组,则该实例包含一组公共属性,其名称和值是源中对应键值对的名称和值。属性的顺序是源元素插入的顺序。