PHP 在變量定義中不需要(或不支持)明確的類(lèi)型定義;變量類(lèi)型是根據使用該變量的上下文所決定的。也就是說(shuō),如果把一個(gè) string 值賦給變量 $var,$var 就成了一個(gè) string。如果又把一個(gè)int 賦給 $var,那它就成了一個(gè)int。
PHP 的自動(dòng)類(lèi)型轉換的一個(gè)例子是乘法運算符“*”。如果任何一個(gè)操作數是float, 則所有的操作數都被當成float,結果也是float。 否則操作數會(huì )被解釋為int,結果也是int。 注意這并沒(méi)有改變這些操作數本身的類(lèi)型; 改變的僅是這些操作數如何被求值以及表達式本身的類(lèi)型。
<?php
$foo = "1"; // $foo 是字符串 (ASCII 49)
$foo *= 2; // $foo 現在是一個(gè)整數 (2)
$foo = $foo * 1.3; // $foo 現在是一個(gè)浮點(diǎn)數 (2.6)
$foo = 5 * "10 Little Piggies"; // $foo 是整數 (50)
$foo = 5 * "10 Small Pigs"; // $foo 是整數 (50)
?>
如果上面兩個(gè)例子看上去古怪的話(huà),參見(jiàn)如何將 數字字符串轉換為數值。
如果要強制將一個(gè)變量當作某種類(lèi)型來(lái)求值,參見(jiàn)類(lèi)型強制轉換一節。如果要改變一個(gè)變量的類(lèi)型,參見(jiàn) settype()。
如果想要測試本節中任何例子的話(huà),可以用 var_dump() 函數。
注意:
自動(dòng)轉換為 數組 的行為目前沒(méi)有定義。
此外,由于 PHP 支持使用和數組下標同樣的語(yǔ)法訪(fǎng)問(wèn)字符串下標,以下例子在所有 PHP 版本中都有效:
<?php
$a = 'car'; // $a 是 string
$a[0] = 'b'; // $a 仍然是 string
echo $a; // bar
?>請參閱存取和修改字符串中的字符一節以獲取更多信息。
PHP 中的類(lèi)型強制轉換和 C 中的非常像:在要轉換的變量之前加上用括號括起來(lái)的目標類(lèi)型。
<?php
$foo = 10; // $foo is an integer
$bar = (boolean) $foo; // $bar is a boolean
?>
允許的強制轉換有:
向前兼容 (binary) 轉換和 b 前綴轉換。注意 (binary) 轉換和 (string) 基本相同,但是不應該依賴(lài)它。
(unset) 轉換在 PHP 7.2.0 中已被廢棄。請注意 (unset) 轉換等于將值賦予 NULL。(unset) 轉換已經(jīng)在 PHP 8.0.0 中被移除。
注意在括號內允許有空格和制表符,所以下面兩個(gè)例子功能相同:
<?php
$foo = (int) $bar;
$foo = ( int ) $bar;
?>
將字符串文字和變量轉換為二進(jìn)制字符串:
<?php
$binary = (binary)$string;
$binary = b"binary string";
?>
注意:
可以將變量放置在雙引號中的方式來(lái)代替將變量轉換成字符串:
<?php
$foo = 10; // $foo 是一個(gè)整數
$str = "$foo"; // $str 是一個(gè)字符串
$fst = (string) $foo; // $fst 也是一個(gè)字符串
// 輸出 "they are the same"
if ($fst === $str) {
echo "they are the same";
}
?>
有時(shí)在類(lèi)型之間強制轉換時(shí)確切地會(huì )發(fā)生什么可能不是很明顯。更多信息見(jiàn)如下小節: