PHP中的類型轉換
類型轉換,是指變量從一種數據類型轉變成另一種數據類型,類型轉換的方法有兩種,一種是自動轉換,另一種是強制轉換。
自動類型轉換的判別
PHP 在變量定義中不需要(或不支持)明確的類型定義;變量類型是根據使用該變量的上下文所決定的。也就是說,如果把一個 string 值賦給變量
<?php
$var=123;
var_dump($var);
$var='hi';
var_dump($var);
$var=true;
var_dump($var);
?>
輸出結果如下:
PHP 的自動類型轉換的一個例子是加法運算符”+”。如果任何一個操作數是float,則所有的操作數都被當成float,結果也是float。否則操作數會被解釋爲integer,結果也是integer。注意這並沒有改變這些操作數本身的類型;改變的僅是這些操作數如何被求值以及表達式本身的類型。
<?php
//運算自動轉換
$foo = "0"; // $foo 是字符串 (ASCII 48)
var_dump($foo);
$foo += 2; // $foo 現在是一個整數 (2)
var_dump($foo);
$foo = $foo + 1.3; // $foo 現在是一個浮點數 (3.3)
var_dump($foo);
$foo=1;
$bar=$foo+1.22; //$foo還是一個整形,$bar是浮點數
var_dump($foo);
var_dump($bar);
?>
運行結果如下:
強制轉換
PHP 中的類型強制轉換和 C 中的非常像:在要轉換的變量之前加上用括號括起來的目標類型。
允許的強制轉換有:
- (int), (integer) - 轉換爲整形 integer
- (bool), (boolean) - 轉換爲布爾類型 boolean
- (float), (double), (real) - 轉換爲浮點型 float
- (string) - 轉換爲字符串 string
- (array) - 轉換爲數組 array
- (object) - 轉換爲對象 object
- (unset) - 轉換爲 NULL (PHP 5)
另外,還可以用strval(),intval(),floatval()等函數來進行強制類型轉換。
各種類型的相互轉換
轉換爲布爾型
當轉換爲 boolean 時,以下值被認爲是 FALSE:
- 布爾值 FALSE 本身
- 整型值 0(零)
- 浮點型值 0.0(零)
- 空字符串,以及字符串 “0”
- 不包括任何元素的數組
- 不包括任何成員變量的對象(僅 PHP 4.0 適用)
- 從空標記生成的 SimpleXML 對象
所有其它值都被認爲是 TRUE(包括任何資源)。
測試程序如下:
<?php
$arr=array();
if(0){
echo '0 is true </br>';
}else{
echo '0 is false </br>';
}
if(0.0){
echo '0.0 is true </br>';
}else{
echo '0.0 is false </br>';
}
if(''){
echo '空字符串 is true </br>';
}else{
echo '空字符串 is false </br>';
}
if($arr){
echo "空數組 is true </br>";
}else{
echo "空數組 is false </br>";
}
if(null){
echo 'null is true </br>';
}else{
echo 'null is false </br>';
}
運行結果如下:
轉換爲string型
一個值可以通過在其前面加上 (string) 或用 strval() 函數來轉變成字符串。在一個需要字符串的表達式中,會自動轉換爲 string。比如在使用函數 echo 或 print 時,或在一個變量和一個 string 進行比較時,就會發生這種轉換。類型和類型轉換可以更好的解釋下面的事情,也可參考函數 settype()。
一個布爾值 boolean 的 TRUE 被轉換成 string 的 “1”。Boolean 的 FALSE 被轉換成 “”(空字符串)。這種轉換可以在 boolean 和 string 之間相互進行。
一個整數 integer 或浮點數 float 被轉換爲數字的字面樣式的 string(包括 float 中的指數部分)。使用指數計數法的浮點數(4.1E+6)也可轉換。
注意:數組轉化成字符串會變成Array,對象不可以轉換成字符串。資源 resource 總會被轉變成 “Resource id #1” 這種結構的字符串,其中的 1 是 PHP 在運行時分配給該 resource 的唯一值。不要依賴此結構,可能會有變更。直接把 array,object 或 resource 轉換成 string 不會得到除了其類型之外的任何有用信息。可以使用函數 print_r() 和 var_dump() 列出這些類型的內容。
<?php
error_reporting(E_ALL&~E_NOTICE);
$arr=array();
$object=new stdClass();
var_dump(strval(1));
var_dump(strval(1.01));
var_dump(strval(true));
var_dump(strval(false));
var_dump($arr);
?>
運行結果如下:
轉換爲浮點數
如果對字符串進行數值運算,包含 ‘.’,’e’ 或 ‘E’ 並且其數字值在整型的範圍之內(由 PHP_INT_MAX 所定義),該字符串將被當成 float來取值,否則轉換爲integer。
<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>
轉換爲整型
要明確地將一個值轉換爲 integer,用 (int) 或 (integer) 強制轉換。不過大多數情況下都不需要強制轉換,因爲當運算符,函數或流程控制需要一個 integer 參數時,值會自動轉換。還可以通過函數 intval() 來將一個值轉換成整型。
從布爾型轉換時,FALSE 將產生出 0(零),TRUE 將產生出 1(壹)。
當從浮點數轉換成整數時,將向下取整。
注意:如果浮點數超出了整數範圍(32 位平臺下通常爲 +/- 2.15e+9 = 2^31,64 位平臺下通常爲 +/- 9.22e+18 = 2^63),則結果爲未定義,因爲沒有足夠的精度給出一個確切的整數結果。在此情況下沒有警告,甚至沒有任何通知!
從字符串轉換時,字符串的首字母若爲整型,則轉化爲該整型,若字符串首字母不是整形,則轉化爲0.
<?php
$foo=12 + "5fa"; //結果爲17
var_dump($foo);
$bar=12 + "f5a"; //結果爲12
var_dump($bar);
?>
轉換爲數組
對於任意 integer,float,string,boolean 和 resource 類型,如果將一個值轉換爲數組,將得到一個僅有一個元素的數組,其下標爲 0,該元素即爲此標量的值。換句話說,(array)
如果一個 object 類型轉換爲 array,則結果爲一個數組,其單元爲該對象的屬性。鍵名將爲成員變量名,不過有幾點例外:整數屬性不可訪問;私有變量前會加上類名作前綴;保護變量前會加上一個 ‘*’ 做前綴。這些前綴的前後都各有一個 NULL 字符。這會導致一些不可預知的行爲:
<?php
class A {
private $A; // This will become '\0A\0A'
}
class B extends A {
private $A; // This will become '\0B\0A'
public $AA; // This will become 'AA'
}
var_dump((array) new B());
?>
轉換爲對象
如果將一個對象轉換成對象,它將不會有任何變化。如果其它任何類型的值被轉換成對象,將會創建一個內置類 stdClass 的實例。如果該值爲 NULL,則新的實例爲空。數組轉換成對象將使鍵名成爲屬性名並具有相對應的值。對於任何其它的值,名爲 scalar 的成員變量將包含該值。
<?php
$obj = (object) 'ciao';
echo $obj->scalar; // outputs 'ciao'
?>
轉換爲null
使用 (unset) $var 將一個變量轉換爲 null 將不會刪除該變量或 unset 其值。僅是返回 NULL 值而已。