PHP不需要(或不支持)变量定义中的显式类型定义;变量类型是根据变量使用的上下文确定的。也就是说,如果将字符串值分配给变量$var,$var就会变成字符串。$如果将另一个int代入var,则为int。
PHP的自动类型转换的示例是乘法运算符“*”。如果其中一个操作数是浮点数,则所有操作数都被视为浮点数,结果也是浮点数。否则,操作数将解释为int,结果也为int。请注意,这不会更改操作数本身的类型;只有计算操作数的方法和表达式本身的类型会发生更改。
<?php $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 Small Pigs"; // $foo 是整数 (50) ?>
如果上述两个示例看起来很奇怪,请参见如何将数字字符串转换为数字。
要强制变量被评估为类型,请参见类型强制部分。要更改变量类型,请参见settype()。
如果要测试本节中的示例,请使用var_dump()函数可用。
注意:
自动转换到数组的行为目前尚未确定。
此外,PHP支持使用与数组中的下标相同的语法访问字符串中的下标,因此以下示例适用于所有PHP版本:
<?php $a = 'car'; // $a 是 string $a[0] = 'b'; // $a 仍然是 string echo $a; // bar ?>
类型强制转换
PHP中的类型强制与C中的类型强制非常相似。在要转换的变量之前,将继续使用括号括起来的对象类型。
<?php $foo = 10; // $foo is an integer $bar = (boolean) $foo; // $bar is a boolean ?>
允许的分配角色包括:
(int),(integer)-转换为整数int
(bool),(boolean)-转换为布尔型bool
(float),(double),(real)-转换为float型的float
(string)-转换为字符串string
(数组)-转换为数组数组
(对象)-转换为对象对象
(未设置)-转换为空值
前向兼容(二进制)转换和b前缀转换。(二进制)转换基本上与(字符串)相同,但不要依赖。
(unset)转换在PHP7.2.0中被废止。请注意(未设置的)转换与将值代入空值相同。(unset)转换在PHP8.0.0中被删除。
请注意,以下两个示例具有相同的功能,因为空格和制表符可以在括号中使用。
<?php $foo = (int) $bar; $foo = ( int ) $bar; ?>
将字符串文字和变量转换为二进制字符串:
<?php $binary = (binary)$string; $binary = b"binary string"; ?>
注意:
您可以用双引号将变量括起来,而不是将变量转换为字符串:
<?php $foo = 10; // $foo 是一个整数 $str = "$foo"; // $str 是一个字符串 $fst = (string) $foo; // $fst 也是一个字符串 // 输出 "they are the same" if ($fst === $str) { echo "they are the same"; } ?>
分配角色运算符的优先级非常高,例如(int)$a/$b将被评估为(int)$a)/$b而不是(int)($a/$b)[这就像intdiv一样($a,$b)$a和$b都是整数的情况]。
唯一例外(PHP8.0或更高版本)是指数运算符**[即(int)$a*$b被评估为(int)($a*$b),而不是((int)$a)**$b],特别的访问/调用运算符->、:、[]和(int)$a->$b,(int)$a:$b,(int)$a:$b,(int)$a[$b],(int)$a($b),最后执行转换。变量表达式的结果。
PHP自动类型转换的一个例子是乘法运算符“*”。如果其中一个操作数是浮点,则两个操作数都被计算为浮点,结果将是浮点。否则,操作数将被解释为整数,结果也将是整数。请注意,这并不会改变操作数本身的类型;唯一的变化是操作数的e求值以及表达式本身的类型。”
我理解doc试图在这里说什么,但这句话不正确,其他类型可以强制为浮点。
了解类型转换的优先级(因为缺少更好的词)将是有用的。该条目目前解释说,“如果其中一个操作数是浮点,则两个操作数都被计算为浮点,结果将是浮点”,但可以(我认为应该)提供一个层次结构,例如,“在整数和布尔值之间,整数获胜;在浮点和整数之间,浮点获胜;在字符串和浮点之间,字符串获胜”等等(不要指望我的示例准确地捕获真正的层次结构,因为我实际上没有做过测试来弄清楚)。