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