類型戲法

PHP 在變量定義中不需要(或不支援)明示的類型定義;變量類型是根據使用該變量的上下文所決定的。也就是說,若果把一個字串值賦給變量 varvar 就成了一個字串。若果又把一個整型值賦給 var,那它就成了一個整數。

PHP 的自動類型轉換的一個例子是加號「+」。若果任何一個運算數是浮點數,則所有的運算數都被當成浮點數,結果也是浮點數。否則運算數會被解釋為整數,結果也是整數。注意這並沒有改變這些運算數本身的類型;改變的僅是這些運算數如何被求值。

<?php
$foo 
"0";  // $foo is string (ASCII 48)
$foo += 2;   // $foo is now an integer (2)
$foo $foo 1.3;  // $foo is now a float (3.3)
$foo "10 Little Piggies"// $foo is integer (15)
$foo "10 Small Pigs";     // $foo is integer (15)
?>

若果上面兩個例子看上去古怪的話,參見字串轉換為數值

若果要強制將一個變量當作某種類型來求值,參見類型強制轉換一節。若果要改變一個變量的類型,參見 settype()

若果想要測試本節中任何例子的話,可以用 var_dump() 函數。

注: 陣列的自動轉換行為目前沒有定義。

<?php
$a 
"1";     // $a 是字串
$a[0] = "f";  // 是字串偏移量嗎?結果會是什麼?
?>

由於一些歷史原因,PHP 支援通過偏移量進行的字串索引,這和陣列索引的語法一樣。以上的例子就產生了一個問題:$a 應該變成一個第一個元素是「f」的陣列呢,還是「f」成了字串 $a 的第一個字元?

目前版本的 PHP 將以上第二個賦值理解成字串的偏移量標識,即 $a 變成了 "f",儘管如此,這種自動轉換的地結果應該被認為未定義。PHP 4 引入了新的花括號語法來訪問字串的字元,請使用該語法來替代以上的動作:

<?php
$a    
"abc"// $a 為一個字串
$a{1} = "f";   // $a 目前為 "afc"
?>

請參閱訪問和修改字串中的字元一節以取得更多訊息。

類型強制轉換

PHP 中的類型強制轉換和 C 中的非常像:在要轉換的變量之前加上用括號括起來的目的類型。

<?php
$foo 
10;   // $foo is an integer
$bar = (boolean) $foo;   // $bar is a boolean
?>

容許的強制轉換有:

  • (int),(integer) - 轉換成整型

  • (bool),(boolean) - 轉換成布爾型

  • (float),(double),(real) - 轉換成浮點型

  • (string) - 轉換成字串

  • (array) - 轉換成陣列

  • (object) - 轉換成物件

注意在括號內容許有空格和製表符,所以下面兩個例子功能相同:

<?php
$foo 
= (int) $bar;
$foo = ( int ) $bar;
?>

注: 為了將一個變量復原為字串,還可以將變量放置在雙引號中。

<?php
$foo 
10;            // $foo is an integer
$str "$foo";        // $str is a string
$fst = (string) $foo// $fst is also a string

// This prints out that "they are the same"
if ($fst === $str) {
    echo 
"they are the same";
}
?>

當在某些類型之間強制轉換時確切地會發生什麼可能不是很明顯。更多訊息見如下小節: