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