摘要:非法下標(biāo)類型會(huì)產(chǎn)生一個(gè)級(jí)別錯(cuò)誤。用負(fù)數(shù)下標(biāo)寫入字符串時(shí)會(huì)產(chǎn)生一個(gè)級(jí)別錯(cuò)誤,用負(fù)數(shù)下標(biāo)讀取字符串時(shí)返回空字符串。浮點(diǎn)數(shù)也會(huì)被轉(zhuǎn)換為整型,意味著其小數(shù)部分會(huì)被舍去。
Boolean
當(dāng)轉(zhuǎn)換為 boolean 時(shí),以下值被認(rèn)為是 FALSE:
布爾值 FALSE 本身
整型值 0(零)
浮點(diǎn)型值 0.0(零)
空字符串"",以及字符串 "0"
不包括任何元素的數(shù)組[]
特殊類型 NULL(包括尚未賦值的變量)
從空標(biāo)記生成的 SimpleXML 對(duì)象
所有其它值都被認(rèn)為是 TRUE(包括任何資源 和 NAN)。
整數(shù)
注意類型轉(zhuǎn)換:
如果給定的一個(gè)數(shù)超出了 integer 的范圍,將會(huì)被解釋為 float。同樣如果執(zhí)行的運(yùn)算結(jié)果超出了 integer 范圍,也會(huì)返回 float。
Example #2 32 位系統(tǒng)下的整數(shù)溢出
Example #3 64 位系統(tǒng)下的整數(shù)溢出
浮點(diǎn)型
(也叫浮點(diǎn)數(shù) float,雙精度數(shù) double 或?qū)崝?shù) real)可以用以下任一語法定義:
浮點(diǎn)數(shù)的精度有限。
floor((0.1+0.7)*10) 通常會(huì)返回 7 而不是預(yù)期中的 8,因?yàn)樵摻Y(jié)果內(nèi)部的表示其實(shí)是類似
7.9999999999999991118...。
所以永遠(yuǎn)不要相信浮點(diǎn)數(shù)結(jié)果精確到了最后一位,也永遠(yuǎn)不要比較兩個(gè)浮點(diǎn)數(shù)是否相等
$a 和 $b 在小數(shù)點(diǎn)后五位精度內(nèi)都是相等的。
字符串 單引號(hào)
只轉(zhuǎn)義
雙引號(hào)
正則用雙引號(hào)
換行(ASCII 字符集中的 LF 或 0x0A (10)) 回車(ASCII 字符集中的 CR 或 0x0D (13)) 水平制表符(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 起) 反斜線 $ 美元標(biāo)記 " 雙引號(hào)" [0-7]{1,3} 符合該正則表達(dá)式序列的是一個(gè)以八進(jìn)制方式來表達(dá)的字符 x[0-9A-Fa-f]{1,2} 符合該正則表達(dá)式序列的是一個(gè)以十六進(jìn)制方式來表達(dá)的字符
雙引號(hào)示例:
getName(): {${$object->getName()}}"; // 有效,輸出: I"d like an A & W echo "I"d like an {${beers::softdrink}} "; // 也有效,輸出: I"d like an Alexander Keith"s echo "I"d like an {${beers::$ale}} "; ?>Heredoc 結(jié)構(gòu)
沒有使用雙引號(hào)的雙引號(hào)字符串
Warning
要注意的是結(jié)束標(biāo)識(shí)符這行除了可能有一個(gè)分號(hào)(;)外,絕對(duì)不能包含其它字符。這意味著標(biāo)識(shí)符不能縮進(jìn),分號(hào)的前后也不能有任何空白或制表符。更重要的是結(jié)束標(biāo)識(shí)符的前面必須是個(gè)被本地操作系統(tǒng)認(rèn)可的換行,比如在 UNIX 和 Mac OS X 系統(tǒng)中是 n,而結(jié)束定界符(可能其后有個(gè)分號(hào))之后也必須緊跟一個(gè)換行。如果不遵守該規(guī)則導(dǎo)致結(jié)束標(biāo)識(shí)不“干凈”,PHP 將認(rèn)為它不是結(jié)束標(biāo)識(shí)符而繼續(xù)尋找。如果在文件結(jié)束前也沒有找到一個(gè)正確的結(jié)束標(biāo)識(shí)符,PHP 將會(huì)在最后一行產(chǎn)生一個(gè)解析錯(cuò)誤。
Heredocs 結(jié)構(gòu)不能用來初始化類的屬性。自 PHP 5.3 起,此限制僅對(duì) heredoc 包含變量時(shí)有效。
foo. Now, I am printing some {$foo->bar[1]}. This should print a capital "A": x41 EOT; This does not: foo(<<Nowdoc 結(jié)構(gòu)
單引號(hào)字符串
存取和修改
用超出字符串長度的下標(biāo)寫入將會(huì)拉長該字符串并以空格填充。非整數(shù)類型下標(biāo)會(huì)被轉(zhuǎn)換成整數(shù)。非法下標(biāo)類型會(huì)產(chǎn)生一個(gè) E_NOTICE 級(jí)別錯(cuò)誤。用負(fù)數(shù)下標(biāo)寫入字符串時(shí)會(huì)產(chǎn)生一個(gè) E_NOTICE
級(jí)別錯(cuò)誤,用負(fù)數(shù)下標(biāo)讀取字符串時(shí)返回空字符串。寫入時(shí)只用到了賦值字符串的第一個(gè)字符。用空字符串賦值則賦給的值是 NULL 字符。PHP 的字符串在內(nèi)部是字節(jié)組成的數(shù)組。因此用花括號(hào)訪問或修改字符串對(duì)多字節(jié)字符集很不安全。僅應(yīng)對(duì)單字節(jié)編碼例如 ISO-8859-1 的字符串進(jìn)行此類操作。
Note:轉(zhuǎn)換
自 PHP 5.4 起字符串下標(biāo)必須為整數(shù)或可轉(zhuǎn)換為整數(shù)的字符串,否則會(huì)發(fā)出警告。之前例如 "foo" 的下標(biāo)會(huì)無聲地轉(zhuǎn)換成 0。
PHP 5.5 增加了直接在字符串原型中用 [] 或 {} 訪問字符的支持。
1.一個(gè)值可以通過在其前面加上 (string) 或用 strval() 函數(shù)來轉(zhuǎn)變成字符串
2.一個(gè)布爾值 boolean 的 TRUE 被轉(zhuǎn)換成 string 的 "1"。Boolean 的 FALSE 被轉(zhuǎn)換成 ""(空字符串)
3.數(shù)組 array 總是轉(zhuǎn)換成字符串 "Array"
4.在 PHP 4 中對(duì)象 object 總是被轉(zhuǎn)換成字符串 "Object",PHP 5 起,適當(dāng)時(shí)可以用 __toString 方法。
5.資源 resource 總會(huì)被轉(zhuǎn)變成 "Resource id #1" 這種結(jié)構(gòu)的字符串,其中的 1 是 PHP 在運(yùn)行時(shí)分配給該 resource 的唯一值
6.NULL 總是被轉(zhuǎn)變成空字符串。
字符串的開始部分決定了它的值。如果該字符串以合法的數(shù)值開始,則使用該數(shù)值。否則其值為 0(零)。
數(shù)組
PHP 中的數(shù)組實(shí)際上是一個(gè)有序映射。映射是一種把 values 關(guān)聯(lián)到 keys 的類型。此類型在很多方面做了優(yōu)化,因此可以把它當(dāng)成真正的數(shù)組,或列表(向量),散列表(是映射的一種實(shí)現(xiàn)),字典,集合,棧,隊(duì)列以及更多可能性。
PHP 數(shù)組可以同時(shí)含有 integer 和 string 類型的鍵名,因?yàn)?PHP 實(shí)際并不區(qū)分索引數(shù)組和關(guān)聯(lián)數(shù)組。Key
key 會(huì)有如下的強(qiáng)制轉(zhuǎn)換:
1.包含有合法整型值的字符串會(huì)被轉(zhuǎn)換為整型。例如鍵名 "8" 實(shí)際會(huì)被儲(chǔ)存為 8。但是 "08" 則不會(huì)強(qiáng)制轉(zhuǎn)換,因?yàn)槠洳皇且粋€(gè)合法的十進(jìn)制數(shù)值。
2.浮點(diǎn)數(shù)也會(huì)被轉(zhuǎn)換為整型,意味著其小數(shù)部分會(huì)被舍去。例如鍵名 8.7 實(shí)際會(huì)被儲(chǔ)存為 8。
3.布爾值也會(huì)被轉(zhuǎn)換成整型。即鍵名 true 實(shí)際會(huì)被儲(chǔ)存為 1 而鍵名 false 會(huì)被儲(chǔ)存為 0。
4.Null 會(huì)被轉(zhuǎn)換為空字符串,即鍵名 null 實(shí)際會(huì)被儲(chǔ)存為 ""。
5.數(shù)組和對(duì)象不能被用為鍵名。堅(jiān)持這么做會(huì)導(dǎo)致警告:Illegal offset type。
Example #2 類型強(qiáng)制與覆蓋示例
"a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array); ?>
以上例程會(huì)輸出:
array(1) { [1]=> string(1) "d" }
Example #3 混合 integer 和 string 鍵名
"bar", "bar" => "foo", 100 => -100, -100 => 100, ); var_dump($array); ?>
以上例程會(huì)輸出:
array(4) { ["foo"]=> string(3) "bar" ["bar"]=> string(3) "foo" [100]=> int(-100) [-100]=> int(100) }
Example #5 僅對(duì)部分單元指定鍵名
"c", "d", ); var_dump($array); ?>
以上例程會(huì)輸出:
array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [6]=> string(1) "c" [7]=> string(1) "d" }轉(zhuǎn)換
integer,float,string,boolean 和 resource 類型轉(zhuǎn)換為數(shù)組,將得到一個(gè)僅有一個(gè)元素的數(shù)組,其下標(biāo)為 0,該元素即為此標(biāo)量的值。換句話說,(array)$scalarValue 與 array($scalarValue) 完全一樣。
如果一個(gè) object 類型轉(zhuǎn)換為 array,則結(jié)果為一個(gè)數(shù)組,其單元為該對(duì)象的屬性。鍵名將為成員變量名,不過有幾點(diǎn)例外:整數(shù)屬性不可訪問;私有變量前會(huì)加上類名作前綴;保護(hù)變量前會(huì)加上一個(gè) "*" 做前綴。這些前綴的前后都各有一個(gè) NULL 字符。這會(huì)導(dǎo)致一些不可預(yù)知的行為: