PHP 类型转换

蘑菇| 阅读:13 发表时间:2017-06-30 10:48 语言

类型转换的判别

PHP在变量定义中不需要(或不支持)明确的类型定义;变量类型是根据使用该变量的上下文所决定的。也就是说,如果把一个 string 值赋给变量 $var,$var 就成了一个 string。如果又把一个integer 赋给 $var,那它就成了一个integer。


PHP的自动类型转换的一个例子是乘法运算符“*”。如果任何一个操作数是float,则所有的操作数都被当成float,结果也是float。否则操作数会被解释为integer,结果也是integer。注意这并没有改变这些操作数本身的类型;改变的仅是这些操作数如何被求值以及表达式本身的类型。

$foo = "1";                  // $foo 是字符串 (ASCII 49)
$foo *= 2;                   // $foo 现在是一个整数 (2)
$foo = $foo * 1.3;         // $foo 现在是一个浮点数 (2.6)
$foo = 5 * "10 Little Piggies";   // $foo 是整数 (50)
$foo = 5 * "10.2 Small Pigs";     // $foo 是浮点数 (51)

注意

自动转换为 数组 的行为目前没有定义。

此外,由于PHP支持使用和数组下标同样的语法访问字符串下标,以下例子在所有PHP版本中都有效:

$a = 'car';     // $a is a string
$a[0] = 'b';   // $a is still a string
echo $a;       // bar


类型强制转换

PHP中的类型强制转换和C中的非常像:在要转换的变量之前加上用括号括起来的目标类型。

允许的强制转换有:

(int), (integer) - 转换为整形 integer

(bool), (boolean) - 转换为布尔类型 boolean

(float), (double), (real) - 转换为浮点型 float

(string) - 转换为字符串 string

(array) - 转换为数组 array

(object) - 转换为对象 object

(unset) - 转换为 NULL (PHP 5)

(binary) 转换和 b 前缀转换支持为 PHP 5.2.1 新增。

注:注意在括号内允许有空格和制表符。

将字符串文字和变量转换为二进制字符串:

$string = 'str';
$binary = (binary)$string;
$binary = b"binary string";

可以将变量放置在双引号中的方式来代替将变量转换成字符串:

$foo = 10;            // $foo 是一个整数
$str = "$foo";        // $str 是一个字符串
$fst = (string) $foo; // $fst 也是一个字符串

// 输出 "they are the same"
if ($fst === $str) {
    echo "they are the same";
}


转换为布尔值

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。

当运算符、函数或者流程控制结构需要一个boolean参数时,该值会被自动转换。


当转换为 boolean 时,以下值被认为是 FALSE:

① 布尔值 FALSE 本身

② 整型值 0(零)

③ 浮点型值 0.0(零)

④ 空字符串,以及字符串 "0"

⑤ 不包括任何元素的数组

⑥ 特殊类型 NULL(包括尚未赋值的变量)

⑦ 从空标记生成的 SimpleXML 对象

 

所有其它值都被认为是TRUE(包括任何 资源 和NAN)。

注:-1和其它非零值(不论正负)一样,被认为是TRUE


转换为整型

要明确地将一个值转换为integer,用 (int) 或 (integer) 强制转换。

当运算符、函数或流程控制需要一个integer参数时,值会自动转换。

还可以通过函数intval()来将一个值转换成整型。


将 resource 转换成 integer 时,结果会是 PHP 运行时为 resource 分配的唯一资源号。


① 从布尔值转换

FALSE 将产生出 0(零),TRUE 将产生出 1(壹)。


② 从浮点型转换

当从浮点数转换成整数时,将向下取整。

如果浮点数超出了整数范围,则结果为未定义,因为没有足够的精度给出一个确切的整数结果。在此情况下没有警告,甚至没有任何通知!


③ 从字符串转换

当一个字符串被当作一个数值来取值,其结果和类型如下:

如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。


该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。

$foo = 1 + "10.5";                // $foo is float (11.5)
$foo = 1 + "-1.3e3";              // $foo is float (-1299)
$foo = 1 + "bob-1.3e3";           // $foo is integer (1) 不懂
$foo = 1 + "bob3";                // $foo is integer (1)
$foo = 1 + "10 Small Pigs";       // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1;          // $foo is float (11)
$foo = "10.0 pigs " + 1.0;        // $foo is float (11)


④ 从其它类型转换

警告:没有定义从其它类型转换为整型的行为。不要依赖任何现有的行为,因为它会未加通知地改变。


转换为浮点型

请参阅“转换为整型”。

自 PHP 5 起,如果试图将对象转换为浮点数,会发出一条 E_NOTICE 错误消息。


转换为字符串

一个值可以通过在其前面加上 (string) 或用 strval() 函数来转变成字符串。

在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。


一个布尔值 boolean 的 TRUE 被转换成 string 的 "1"。Boolean 的 FALSE 被转换成 ""(空字符串)。这种转换可以在 boolean 和 string 之间相互进行。


一个整数 integer 或浮点数 float 被转换为数字的字面样式的 string(包括 float 中的指数部分)。使用指数计数法的浮点数(4.1E+6)也可转换。


数组 array 总是转换成字符串 "Array"。


在 PHP 4 中对象 object 总是被转换成字符串 "Object"。为了得到对象的类的名称,可以用 get_class() 函数。自 PHP 5 起,适当时可以用 __toString 方法。


资源 resource 总会被转变成 "Resource id #1" 这种结构的字符串,其中的 1 是 PHP 在运行时分配给该 resource 的唯一值。不要依赖此结构,可能会有变更。要得到一个 resource 的类型,可以用函数 get_resource_type()。


NULL 总是被转变成空字符串。


大部分的 PHP 值可以转变成 string 来永久保存,这被称作串行化,可以用函数 serialize() 来实现。如果 PHP 引擎设定支持 WDDX,PHP 值也可被串行化为格式良好的 XML 文本。


转换为数组

对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。


如果一个 object 类型转换为 array,则结果为一个数组,其单元为该对象的属性。键名将为成员变量名,不过有几点例外:整数属性不可访问;私有变量前会加上类名作前缀;保护变量前会加上一个 '*' 做前缀。这些前缀的前后都各有一个 NULL 字符。


将 NULL 转换为 array 会得到一个空的数组。


转换为对象

如果将一个对象转换成对象,它将不会有任何变化。如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。如果该值为 NULL,则新的实例为空。 array 转换成 object 将使键名成为属性名并具有相对应的值,除了数字键,不迭代就无法被访问。


对于其他值,会包含进成员变量名 scalar。


转换为资源

由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。


转换为 NULL

使用 (unset) $var 将一个变量转换为 null 将不会删除该变量或 unset 其值。仅是返回 NULL 值而已。


类型比较表

表格显示了 PHP 类型和比较运算符在松散和严格比较时的作用。


注意:

HTML 表单并不传递整数、浮点数或者布尔值,它们只传递字符串。要想检测一个字符串是不是数字,可以使用 is_numeric() 函数。

② 在没有定义变量 $x 的时候,诸如 if ($x) 的用法会导致一个 E_NOTICE 级别的错误。所以,可以考虑用 empty() 或者 isset() 函数来初始化变量。

版权声明:
1.本文仅代表作者观点,不代表蒙奇蘑菇的立场。
2.本文系作者授权蒙奇蘑菇发表,未经许可,不得转载。如有侵权,请联系本站删除。