当前位置: 首页 > 文档资料 > PHP 语言规范 >

08 类型转换

优质
小牛编辑
118浏览
2023-12-01

概述

显式的类型转换使用强制类型转换运算符。 如果一个操作或者语言结构期望操作对象是某一种类型,但是提供的是另外一种类型的值时, 隐式(自动)类型转换就会执行。在大多数内部函数中也会有隐式的类型转换, 然而有些函数会根据参数类型不同,从而去执行不同的操作, 这种情况下不会执行类型转换。

如果一个类型被转换成自己原来的类型,则结果的类型和值跟原来是相同的。

不允许转换为资源null类型。

转换为布尔类型

转换的结果类型布尔型

如果原类型是intfloat,并且原值为 0 ,转换后的结果是FALSE;否则,结果值是TRUE

如果原值是NULL,结果值是FALSE

如果原值是一个空字符串或者字符串“0”,结果值是FALSE;否则结果值是TRUE

如果原值是一个包涵 0 个元素的数组,结果值是FALSE;否则值是TRUE

如果原值是一个对象,结果值是TRUE

如果原值是资源类型,结果值是TRUE

内置函数boolval能够获取变量的布尔值。

转换为整型

转换的结果类型整型

如果原类型是布尔型,并且值是FALSE,结果值是 0 ;否则结果值是 1 。

If the source type is float, for the values INF, -INF, and NAN, the result value is zero. For all other values, if the precision can be preserved (that is, the float is within the range of an integer), the fractional part is rounded towards zero. If the precision cannot be preserved, the following conversion algorithm is used, where X is defined as two to the power of the number of bits in an integer (for example, 2 to the power of 32, i.e. 4294967296):

如果原值类型是float,对于值是INF-INFNAN时,结果值是 0 (PHP7 下测试是 0,PHP5.6 是-9223372036854775808)。 如果浮点数在精度范围内,浮点数向零取整,小数部分趋近于零。(以下内容没有理解透彻,暂不翻译) 考虑参考浮点数到整数的转换

  1. We take the floating point remainder (wherein the remainder has the same sign as the dividend) of dividing the float by X, rounded towards zero.
  2. If the remainder is less than zero, it is rounded towards infinity and X is added.
  3. This result is converted to an unsigned integer.
  4. This result is converted to a signed integer by treating the unsigned integer as a two's complement representation of the signed integer.

这种转换可以使用不同的方法实现(比如,在某些架构可能有特定的硬件支持特定的转换模式), 只要转换结果相同即可。

如果原值是NULL,结果值是 0。

字符串转换为整型。如果是一个数字字符串或者以数字开头的字符串,拥有整型的格式, 而且精度可以保留,则结果值是该字符串的整型值;否则结果是 undefined。如果是一个数字字符串或者以数字开头的字符串, 但是数字是浮点数类型的格式,根据上面的转换浮点数的方法转换字符串中的浮点数值。忽略字符串中的非数字后缀被。对于其他字符串, 结果值是 0 。

从数组转换为整型。如果是从一个只有0个元素的数组转换为整型,结果值是 0 ;否则结果值是 1 。

从Object 转换成整型,如果类实现定义了一个转换方法函数,则结果根据该函数获得(这个目前只有在内置类中可用)。 如果没有定义转换函数,则转换非法,结果被假定为 1,且抛出一个非致命错误。

如果从资源类型转换为整型,结果值是资源的唯一 ID 。

内置函数intval 可以转换一个值为整型

转换为浮点数类型

转换的结果类型浮点数

If the source type is int, if the precision can be preserved the result value is the closest approximation to the source value; otherwise, the result is undefined.

从整型转换为浮点数类型,如果精度可以保留,则结果值是一个最接近原值的近似值; 否则结果不确定。(觉得此处原文有问题,整型转换为浮点数没那么复杂,不过对于过长整型数字会有如下自动转换。)

// 64位系统,PHP 5.6 / PHP 7
$int = 9223372036854775807;
$float = (float)$int;
var_dump($int);
var_dump($float);


output:
int(9223372036854775807)
float(9.2233720368548E+18)

对于字符串转换为浮点类型,如果是一个数字字符串或者以数字开头的字符串,拥有整型的格式, 而且精度可以保留,则结果值是该字符串的整型值;如果是浮点数形式或者是以浮点数形势开头的字符串,结果值是跟字符串中浮点数最接近的一个值。 忽略字符串中的非数字后缀被。对于其他字符串,结果值是 0 。

对于一个对象,如果类实现定义了一个转换函数,转换结果由该函数决定(这种情况目前只有在内置函数中实现)。 如果没有转换函数,则转换是非法的,结果值被假定为 1.0 ,且会抛出一个非致命错误。

对于其他所有类型,转换结果需要遵循转换为整型,然后在转换为float

内置函数floatval能够获取变量的浮点数值。

转换为字符串类型

转换的结果类型字符串

如果原类型是bool,并且原值是FALSE,那么结果值是空字符串;否则结果值是"1"。

如果原类型是intfloat,那么结果值是原值的文本的一个字符串(可以用库函数sprintf来说明)。

如果原值是NULL,结果值是一个空字符串。

如果原类型是一个数组,那么转换是非法的。转换的结果值是一个"Array"字符串,并且抛出一个非致命错误。

如果原类型是一个 Object 对象,并且如果该对象有__toString方法,则该结果值 即是由该__toString方法返回的字符串;否则,转换是无效的,且抛出一个致命错误。

If the source is a resource, the result value is an implementation-defined string.

如果原类型是资源类型,结果值是运行时定义的一个字符串。(形式是"Resource id #1" 的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。)

库函数strval可以用来转换一个值为字符串。

转换为数组

转换后的结果类型数组

如果原值是NULL,则结果值是一个 0 个元素的空数组。

如果原类型是标量类型或者资源类型,并且是非NULL,则结果值是元素是一个以 0 为 key,转换前原的值为对应值的数组。

如果原类型是一个对象,则结果是一个包含 0 个或多个元素的数组, 并且数组的元素是该对象)实例属性的键值对。并且元素插入数组中的顺序 是按照类成员声明实例属性列表的顺序。

对于 Public 的实例属性,数组元素的键值跟属性名称是一样的。

Private 实例属性的键值的格式是"\0class\0name",其中 class 是类的名称,name 是属性的名称。

Protected 实例属性的键值格式是"\0*\0name",name 是属性的名称。

每个 key 对应的值即是赋予这个属性的值,如果属性没有初始化,值就是NULL

转换为对象类型

转换结果类型对象

如果一个其他任意类型的值被转换成对象,将会创建一个内置类stdClass。 如果该值为NULL,则新的实例为空。如果该值是一个标量类型且非NULL,或者是一个资源类型,则转换后的实例 会包含一个叫做scalar的成员成员变量,对应的值是原值。数组转换成对象将使键名成为属性名并具有相对应的值,属性的顺序同 数组插入的顺序。