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()
函數。<?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
表達了真值,能夠爲TRUE
或 FALSE
code
要指定一個布爾值,使用常量TRUE
或 FALSE
。(不區分大小寫)如:對象
<?php $bool = TRUE; // 設置$bool 爲 TRUE ?>
一般運算符所返回的boolean
值結果會被傳遞給控制流程。資源
要明確的將一個值轉換成boolean
,用(bool)
或者(boolean)
來強制轉換,可是不少狀況下不須要用強制轉換,由於當運算符,函數或者流程控制結構須要一個 boolean
參數時,該值會被自動轉換。
當轉換爲 boolean 時,如下值被認爲是 FALSE:
FALSE
自己NULL
(包括還沒有賦值的變量)全部其它值都被認爲是TRUE
(包括任何資源和NAN
)。
integer 是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某個數。
整型值可使用十進制,十六進制,八進制或二進制表示,前面能夠加上可選的符號(- 或者 +)。
要使用八進制表達,數字前必須加上 0
(零)。要使用十六進制表達,數字前必須加上 0x
。要使用二進制表達,數字前必須加上 0b
。
<?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 起,NaN
和 Infinity
在轉換成 integer
時,再也不是 undefined
或者依賴於平臺,而是都會變成零。
毫不要將未知的分數強制轉換爲 integer,這樣有時會致使不可預料的結果。
<?php echo (int) ( (0.1+0.7) * 10 ); // 顯示 7! ?>
浮點型(也叫浮點數 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
(not a number) 所表明的結果。此結果表明着一個在浮點數運算中未定義或不可表述的值。任何拿此值與其它任何值(除了 TRUE
)進行的鬆散或嚴格比較的結果都是 FALSE
。
因爲 NAN
表明着任何不一樣值,不該拿 NAN
去和其它值進行比較,包括其自身,應該用 is_nan()
來檢查。
一個字符串 string
就是由一系列的字符組成,其中每一個字符等同於一個字節。這意味着 PHP 只能支持 256 的字符集,所以不支持 Unicode
。
分析一下:
1 Byte = 8 bit 因爲1個字節存儲一個字符,那麼1字節所能存儲字符的可能性爲:2^8=256
一個字符串能夠用 4 種方式表達:
定義一個字符串的最簡單的方法是用單引號把它包圍起來(字符 ')。
要表達一個單引號自身,需在它的前面加個反斜線()來轉義。要表達一個反斜線自身,則用兩個反斜線(\)。其它任何方式的反斜線都會被當成反斜線自己:也就是說若是想使用其它轉義序列例如 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 起) |
\ | 反斜線 |
$ | 美圓標記 |
" | 雙引號 |
[0-7]{1,3} | 符合該正則表達式序列的是一個以八進制方式來表達的字符 |
x[0-9A-Fa-f]{1,2} | 符合該正則表達式序列的是一個以十六進制方式來表達的字符 |
和單引號字符串同樣,轉義任何其它字符都會致使反斜線被顯示出來。
用雙引號定義的字符串最重要的特徵是變量會被解析。
第三種表達字符串的方法是用 heredoc 句法結構:<<<
。在該運算符以後要提供一個標識符,而後換行。接下來是字符串 string
自己,最後要用前面定義的標識符做爲結束標誌。
結束時所引用的標識符必須在該行的第一列,並且,標識符的命名也要像其它標籤同樣遵照 PHP 的規則:只能包含字母、數字和下劃線,而且必須以字母和下劃線做爲開頭。
要注意的是結束標識符這行除了可能有一個分號(;)外,絕對不能包含其它字符。這意味着標識符不能縮進,分號的先後也不能有任何空白或製表符。更重要的是結束標識符的前面必須是個被本地操做系統承認的換行,好比在 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; ?>
就像 heredoc 結構相似於雙引號字符串,Nowdoc 結構是相似於單引號字符串的。Nowdoc 結構很象 heredoc 結構,可是 nowdoc 中不進行解析操做。這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義。與 SGML 的 <![CDATA[ ]]> 結構是用來聲明大段的不用解析的文本相似,nowdoc 結構也有相同的特徵。
一個 nowdoc 結構也用和 heredocs 結構同樣的標記 <<<
, 可是跟在後面的標識符要用單引號括起來,即 <<<'EOT'
。Heredoc 結構的全部規則也一樣適用於 nowdoc 結構,尤爲是結束標識符的規則。