類型轉(zhuǎn)換的判別

PHP 在變量定義中不需要(或不支持)明確的類型定義;變量類型是根據(jù)使用該變量的上下文所決定的。也就是說(shuō),如果把一個(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。 注意這并沒(méi)有改變這些操作數(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 "10 Little Piggies"// $foo 是整數(shù) (50)
$foo "10 Small Pigs";     // $foo 是整數(shù) (50)
?>

如果上面兩個(gè)例子看上去古怪的話,參見(jiàn)如何將 數(shù)字字符串轉(zhuǎn)換為數(shù)值。

如果要強(qiáng)制將一個(gè)變量當(dāng)作某種類型來(lái)求值,參見(jiàn)類型強(qiáng)制轉(zhuǎn)換一節(jié)。如果要改變一個(gè)變量的類型,參見(jiàn) settype()。

如果想要測(cè)試本節(jié)中任何例子的話,可以用 var_dump() 函數(shù)。

注意:

自動(dòng)轉(zhuǎn)換為 數(shù)組 的行為目前沒(méi)有定義。

此外,由于 PHP 支持使用和數(shù)組下標(biāo)同樣的語(yǔ)法訪問(wèn)字符串下標(biāo),以下例子在所有 PHP 版本中都有效:

<?php
$a    
'car'// $a 是 string
$a[0] = 'b';   // $a 仍然是 string
echo $a;       // bar
?>

請(qǐng)參閱存取和修改字符串中的字符一節(jié)以獲取更多信息。

類型強(qiáng)制轉(zhuǎn)換

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)換有:

  • (int), (integer) - 轉(zhuǎn)換為整形 int
  • (bool), (boolean) - 轉(zhuǎn)換為布爾類型 bool
  • (float), (double), (real) - 轉(zhuǎn)換為浮點(diǎn)型 float
  • (string) - 轉(zhuǎn)換為字符串 string
  • (array) - 轉(zhuǎn)換為數(shù)組 array
  • (object) - 轉(zhuǎn)換為對(duì)象 object
  • (unset) - 轉(zhuǎn)換為 NULL

向前兼容 (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àn)如下小節(jié):