PHP變量類型

簡介

PHP支持9種原始數據類型。php

4種標量類型:程序員

  • boolean布爾型
  • integer 整形
  • float 浮點型(也稱做double
  • string 字符串

3種複合類型:正則表達式

  • array 數組
  • object 對象
  • callable 可調用

2種特殊類型數組

  • resource 資源
  • null 無類型

爲了確保代碼的易讀性,咱們一般會使用一些僞類型:函數

  • mixed 混合類型
  • number 數字類型
  • callback 回調類型(又稱爲callable
  • array|object 數組|對象類型
  • void 無類型

變量的類型不是程序員設定,是由PHP根據該變量使用的上下文在運行時決定的。測試

與變量類型有關的經常使用函數操作系統

  • 若是想查看某個表達式的值和類型,使用var_dump()函數。
  • 獲取變量的類型,使用gettype()函數。
  • 要檢驗某個類型,可使用is_type函數,如:
<?php
        $a = 1;
        
        if(is_int($a)){
            echo "\r\n\$a是在整形\r\n";
        }
        
        if(is_float($a)){
            echo "\r\n\$a是在浮點型\r\n";
        }
        
        if(is_string($a)){
            echo "\r\n\$a是在字符串\r\n";
        }

        ......
    ?>
  • 若是須要將一個變量強制轉換爲某類型,能夠對其使用強制轉換或者settype()函數。

接下來咱們先來看看四種標量類型

Boolean 布爾類型

這是最簡單的類型。boolean表達了真值,能夠爲TRUEFALSEcode

語法

要指定一個布爾值,使用常量TRUEFALSE。(不區分大小寫)如:對象

<?php
    $bool = TRUE; // 設置$bool 爲 TRUE
?>

一般運算符所返回的boolean值結果會被傳遞給控制流程。資源

轉換爲布爾值

要明確的將一個值轉換成boolean,用(bool)或者(boolean)來強制轉換,可是不少狀況下不須要用強制轉換,由於當運算符,函數或者流程控制結構須要一個 boolean 參數時,該值會被自動轉換。

當轉換爲 boolean 時,如下值被認爲是 FALSE:

  • 布爾值FALSE自己
  • 整型值 0
  • 浮點型 0.0
  • 空字符串,以及字符串"0"
  • 不包括任何元素的數組
  • 特殊類型NULL(包括還沒有賦值的變量)
  • 從空標記生成的SimpleXML對象

全部其它值都被認爲是TRUE(包括任何資源和NAN)。

Integer 整型

integer 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某個數。

語法

整型值可使用十進制,十六進制,八進制或二進制表示,前面能夠加上可選的符號(- 或者 +)。

要使用八進制表達,數字前必須加上 0(零)。要使用十六進制表達,數字前必須加上 0x。要使用二進制表達,數字前必須加上 0b

Example

<?php
    $a = 1234; // 十進制數
    $a = -123; // 負數
    $a = 0123; // 八進制數 (等於十進制 83)
    $a = 0x1A; // 十六進制數 (等於十進制 26)
    $a = 0b11111111; // 二進制數字 (等於十進制 255)
?>

整型數的字長和平臺有關,儘管一般最大值是大約二十億(32 位有符號)。64 位平臺下的最大值一般是大約 9E18,除了 Windows 下 PHP 7 之前的版本,老是 32 位的。 PHP 不支持無符號的 integer。Integer 值的字長能夠用常量 PHP_INT_SIZE來表示,自 PHP 4.4.0 和 PHP 5.0.5後,最大值能夠用常量 PHP_INT_MAX 來表示,最小值能夠在 PHP 7.0.0 及之後的版本中用常量 PHP_INT_MIN 表示。

整數溢出

若是給定的一個數超出了 integer 的範圍,將會被解釋爲 float。一樣若是執行的運算結果超出了 integer 範圍,也會返回 float

PHP 中沒有整除的運算符。1/2 產生出 float 0.5。 值能夠捨棄小數部分,強制轉換爲 integer,或者使用 round() 函數能夠更好地進行四捨五入。

轉換爲整型

要明確地將一個值轉換爲 integer,用 (int)(integer) 強制轉換。不過大多數狀況下都不須要強制轉換,由於當運算符,函數或流程控制須要一個 integer 參數時,值會自動轉換。還能夠經過函數 intval() 來將一個值轉換成整型。

思考下如下兩種流程控制的區別:

<?php
    $num = '1';
    if(1 == $num){
        # code ...
    }
    
    if($num == 1){
        # code ...
    }
?>

從資源類型轉換

resource 轉換成 integer 時, 結果會是 PHP 運行時爲 resource 分配的惟一資源號。

從浮點型轉換

當從浮點數轉換成整數時,將向下取整。

若是浮點數超出了整數範圍(32 位平臺下一般爲 +/- 2.15e+9 = 2^31,64 位平臺下,除了 Windows,一般爲 +/- 9.22e+18 = 2^63),則結果爲未定義,由於沒有足夠的精度給出一個確切的整數結果。在此狀況下沒有警告,甚至沒有任何通知!

PHP 7.0.0 起,NaNInfinity 在轉換成 integer 時,再也不是 undefined 或者依賴於平臺,而是都會變成零。

Warning

毫不要將未知的分數強制轉換爲 integer,這樣有時會致使不可預料的結果。

<?php
    echo (int) ( (0.1+0.7) * 10 ); // 顯示 7!
?>

Float 浮點型

浮點型(也叫浮點數 float,雙精度數 double 或實數 real)能夠用如下任一語法定義:

<?php
    $a = 1.234; 
    $b = 1.2e3; 
    $c = 7E-10;
?>

浮點數的字長和平臺相關,儘管一般最大值是 1.8e308 並具備 14 位十進制數字的精度(64 位 IEEE 格式)

浮點數的精度

浮點數的精度有限。儘管取決於系統,PHP 一般使用 IEEE 754 雙精度格式,則因爲取整而致使的最大相對偏差爲 1.11e-16。非基本數學運算可能會給出更大偏差,而且要考慮到進行復合運算時的偏差傳遞。

此外,以十進制可以精確表示的有理數如 0.1 或 0.7,不管有多少尾數都不能被內部所使用的二進制精確表示,所以不能在不丟失一點點精度的狀況下轉換爲二進制的格式。這就會形成混亂的結果:例如,floor((0.1+0.7)*10) 一般會返回 7 而不是預期中的 8,由於該結果內部的表示實際上是相似 7.9999999999999991118...。

因此永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。若是確實須要更高的精度,應該使用任意精度數學函數或者 gmp 函數。

比較浮點數

如上述警告信息所言,因爲內部表達方式的緣由,比較兩個浮點數是否相等是有問題的。不過仍是有迂迴的方法來比較浮點數值的。

要測試浮點數是否相等,要使用一個僅比該數值大一丁點的最小偏差值。該值也被稱爲機器極小值(epsilon)或最小單元取整數,是計算中所能接受的最小的差異值。

$a 和 $b 在小數點後五位精度內都是相等的。

<?php
    $a = 1.23456789;
    $b = 1.23456780;
    $epsilon = 0.00001;
    
    if(abs($a-$b) < $epsilon) {
        echo "true";
    }
?>

NaN

某些數學運算會產生一個由常量 NAN (not a number) 所表明的結果。此結果表明着一個在浮點數運算中未定義或不可表述的值。任何拿此值與其它任何值(除了 TRUE)進行的鬆散或嚴格比較的結果都是 FALSE

因爲 NAN 表明着任何不一樣值,不該拿 NAN 去和其它值進行比較,包括其自身,應該用 is_nan() 來檢查。

String 字符串

一個字符串 string 就是由一系列的字符組成,其中每一個字符等同於一個字節。這意味着 PHP 只能支持 256 的字符集,所以不支持 Unicode

分析一下:

1 Byte = 8 bit
因爲1個字節存儲一個字符,那麼1字節所能存儲字符的可能性爲:2^8=256

語法

一個字符串能夠用 4 種方式表達:

  1. 單引號
  2. 雙引號
  3. heredoc 語法結構
  4. nowdoc 語法結構

單引號

定義一個字符串的最簡單的方法是用單引號把它包圍起來(字符 ')。

要表達一個單引號自身,需在它的前面加個反斜線()來轉義。要表達一個反斜線自身,則用兩個反斜線(\)。其它任何方式的反斜線都會被當成反斜線自己:也就是說若是想使用其它轉義序列例如 r 或者 n,並不表明任何特殊含義,就單純是這兩個字符自己。

不像雙引號和 heredoc 語法結構,在單引號字符串中的變量特殊字符的轉義序列將不會被替換。

雙引號

果字符串是包圍在雙引號(")中, PHP 將對一些特殊的字符進行解析:

序列 含義
n 換行(ASCII 字符集中的 LF 或 0x0A (10))
r 回車(ASCII 字符集中的 CR 或 0x0D (13))
t 水平製表符(ASCII 字符集中的 HT 或 0x09 (9))
v 垂直製表符(ASCII 字符集中的 VT 或 0x0B (11))(自 PHP 5.2.5 起)
e Escape(ASCII 字符集中的 ESC 或 0x1B (27))(自 PHP 5.4.0 起)
f 換頁(ASCII 字符集中的 FF 或 0x0C (12))(自 PHP 5.2.5 起)
\ 反斜線
&dollar; 美圓標記
" 雙引號
[0-7]{1,3} 符合該正則表達式序列的是一個以八進制方式來表達的字符
x[0-9A-Fa-f]{1,2} 符合該正則表達式序列的是一個以十六進制方式來表達的字符

和單引號字符串同樣,轉義任何其它字符都會致使反斜線被顯示出來。
用雙引號定義的字符串最重要的特徵是變量會被解析。

Heredoc 結構

第三種表達字符串的方法是用 heredoc 句法結構:<<<。在該運算符以後要提供一個標識符,而後換行。接下來是字符串 string 自己,最後要用前面定義的標識符做爲結束標誌。

結束時所引用的標識符必須在該行的第一列,並且,標識符的命名也要像其它標籤同樣遵照 PHP 的規則:只能包含字母、數字和下劃線,而且必須以字母和下劃線做爲開頭。

Warning

要注意的是結束標識符這行除了可能有一個分號(;)外,絕對不能包含其它字符。這意味着標識符不能縮進,分號的先後也不能有任何空白或製表符。更重要的是結束標識符的前面必須是個被本地操做系統承認的換行,好比在 UNIX 和 Mac OS X 系統中是 n,而結束定界符(可能其後有個分號)以後也必須緊跟一個換行。

若是不遵照該規則致使結束標識不「乾淨」,PHP 將認爲它不是結束標識符而繼續尋找。若是在文件結束前也沒有找到一個正確的結束標識符,PHP 將會在最後一行產生一個解析錯誤。

Heredocs 結構不能用來初始化類的屬性。自 PHP 5.3 起,此限制僅對 heredoc 包含變量時有效。

Heredoc 結構就象是沒有使用雙引號的雙引號字符串,這就是說在 heredoc 結構中單引號不用被轉義,可是上文中列出的轉義序列還可使用。變量將被替換,但在 heredoc 結構中含有複雜的變量時要格外當心。

在 PHP 5.3.0 之後,也能夠用 Heredoc 結構來初始化靜態變量和類的屬性和常量。

自 PHP 5.3.0 起還能夠在 Heredoc 結構中用雙引號來聲明標識符:

<?php
    echo <<<"FOOBAR"
    Hello World!
    FOOBAR;
?>

Nowdoc 結構

就像 heredoc 結構相似於雙引號字符串,Nowdoc 結構是相似於單引號字符串的。Nowdoc 結構很象 heredoc 結構,可是 nowdoc 中不進行解析操做。這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義。與 SGML 的 <![CDATA[ ]]> 結構是用來聲明大段的不用解析的文本相似,nowdoc 結構也有相同的特徵。

一個 nowdoc 結構也用和 heredocs 結構同樣的標記 <<<, 可是跟在後面的標識符要用單引號括起來,即 <<<'EOT'。Heredoc 結構的全部規則也一樣適用於 nowdoc 結構,尤爲是結束標識符的規則。

相關文章
相關標籤/搜索