http://php.net/manual/zh/language.types.string.php
關于類型轉換
一個值可以通過在其前面加上 (string) 或用 strval() 函數來轉變成字符串。在一個需要字符串的表達式中,會自動轉換為 string。
比如在使用函數 echo 或 print 時,或在一個變量和一個 string 進行比較時,就會發生這種轉換。類型和類型轉換可以更好的解釋下面的事情,也可參考函數 settype()。
一個布爾值 boolean 的 TRUE 被轉換成 string 的 "1"。Boolean 的 FALSE 被轉換成 ""(空字符串)。這種轉換可以在 boolean 和 string 之間相互進行。
一個整數 integer 或浮點數 float 被轉換為數字的字面樣式的 string(包括 float 中的指數部分)。使用指數計數法的浮點數(4.1E+6)也可轉換。
要精讀
PHP 中的 string 的實現方式是一個由字節組成的數組再加上一個整數指明緩沖區長度。并無如何將字節轉換成字符的信息,由程序員來決定。字符串由什么值來組成并無限制;特別的,其值為 0(“NUL bytes”)的字節可以處于字符串任何位置(不過有幾個函數,在本手冊中被稱為非“二進制安全”的,也許會把 NUL 字節之后的數據全都忽略)。
字符串類型的此特性解釋了為什么 PHP 中沒有單獨的“byte”類型 - 已經用字符串來代替了。返回非文本值的函數 - 例如從網絡套接字讀取的任意數據 - 仍會返回字符串。
由于 PHP 并不特別指明字符串的編碼,那字符串到底是怎樣編碼的呢?例如字符串 "á" 到底是等于 "\xE1"(ISO-8859-1),"\xC3\xA1"(UTF-8,C form),"\x61\xCC\x81"(UTF-8,D form)還是任何其它可能的表達呢?答案是字符串會被按照該腳本文件相同的編碼方式來編碼。因此如果一個腳本的編碼是 ISO-8859-1,則其中的字符串也會被編碼為 ISO-8859-1,以此類推。不過這并不適用于激活了 Zend Multibyte 時;此時腳本可以是以任何方式編碼的(明確指定或被自動檢測)然后被轉換為某種內部編碼,然后字符串將被用此方式編碼。注意腳本的編碼有一些約束(如果激活了 Zend Multibyte 則是其內部編碼)- 這意味著此編碼應該是 ASCII 的兼容超集,例如 UTF-8 或 ISO-8859-1。不過要注意,依賴狀態的編碼其中相同的字節值可以用于首字母和非首字母而轉換狀態,這可能會造成問題。
當然了,要做到有用,操作文本的函數必須假定字符串是如何編碼的。不幸的是,PHP 關于此的函數有很多變種:
某些函數假定字符串是以單字節編碼的,但并不需要將字節解釋為特定的字符。例如 substr(),strpos(),strlen() 和 strcmp()。理解這些函數的另一種方法是它們作用于內存緩沖區,即按照字節和字節下標操作。
某些函數被傳遞入了字符串的編碼方式,也可能會假定默認無此信息。例如 htmlentities() 和 mbstring 擴展中的大部分函數。
其它函數使用了當前區域(見 setlocale()),但是逐字節操作。例如 strcasecmp(),strtoupper() 和 ucfirst()。這意味著這些函數只能用于單字節編碼,而且編碼要與區域匹配。例如 strtoupper("á") 在區域設定正確并且 á 是單字節編碼時會返回 "á"。如果是用 UTF-8 編碼則不會返回正確結果,其結果根據當前區域有可能返回損壞的值。
最后一些函數會假定字符串是使用某特定編碼的,通常是 UTF-8。intl 擴展和 PCRE(上例中僅在使用了 u 修飾符時)擴展中的大部分函數都是這樣。盡管這是由于其特殊用途,utf8_decode() 會假定 UTF-8 編碼而 utf8_encode() 會假定 ISO-8859-1 編碼。
最后,要書寫能夠正確使用 Unicode 的程序依賴于很小心地避免那些可能會損壞數據的函數。要使用來自于 intl 和 mbstring 擴展的函數。不過使用能處理 Unicode 編碼的函數只是個開始。不管用何種語言提供的函數,最基本的還是了解 Unicode 規格。例如一個程序如果假定只有大寫和小寫,那可是大錯特錯。
- 空白目錄
- 安裝
- linux下安裝nginx
- linux下安裝php
- 調試
- windows 安裝wamp
- 常用源
- 類型
- Boolean布爾類型
- Integer整型
- Float浮點型
- String字符串
- Array數組
- Object對象
- Resource資源類型
- NULL
- Callback/Callable類型
- 類型轉換
- 變量
- 預定義變量
- 常量
- 魔術常量(預定義常量)
- 語法
- 運算符
- 流程控制
- 條件語句
- if
- else
- else if/elseif
- switch
- 循環語句
- while
- do-while
- for
- foreach
- break
- return
- continue
- require
- include
- require_once
- include_once
- 函數
- 內置函數
- 匿名函數
- 自定義函數
- 類與對象
- 屬性
- 聲明
- public
- protected
- private
- 類常量
- 方法
- 魔術方法
- __construct()
- __destruct()
- __call()
- __callStatic()
- __get()
- __set()
- __isset()
- __unset()
- __sleep()
- __wakeup()
- __toString()
- __invoke()
- __set_state()
- __clone()
- __debugInfo()
- 方法的調用
- ->(對象運算符)
- ::(范圍解析操作符)
- 設計模式
- 依賴注入
- call_user_func
- is_callable (
- 創建型模式
- 工廠方法模式
- 抽象工廠模式
- 單例模式
- 建造者模式
- 原型模式
- 結構性模式
- 適配器模式
- 裝飾器模式
- 代理模式
- 外觀模式
- 橋接模式
- 組合模式
- 享元模式
- 行為型模式
- 策略模式
- 模板方法模式
- 觀察者模式
- 迭代子模式
- 責任鏈模式
- 命令模式
- 備忘錄模式
- 訪問者模式
- 中介者模式
- 解釋器模式
- 六大原則
- uml語言
- 反射
- 類型約束
- 調試
- lamp
- lnmp
- composer
- 工作常用
- UML圖
- 常見問題