PHP中的類型轉換

PHP中的類型轉換

類型轉換,是指變量從一種數據類型轉變成另一種數據類型,類型轉換的方法有兩種,一種是自動轉換,另一種是強制轉換。

自動類型轉換的判別

PHP 在變量定義中不需要(或不支持)明確的類型定義;變量類型是根據使用該變量的上下文所決定的。也就是說,如果把一個 string 值賦給變量 var var 就成了一個 string。如果又把一個integer 賦給 $var,那它就成了一個integer。

<?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)scalarValuearray( scalarValue) 完全一樣。

如果一個 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 值而已。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章