PHP的資料類型分為八種資料類型,
PHP字串也是其中一種,今天我們就來詳細講解一下
PHP字串。
簡介
PHP中字串的實現方式是一個由位元組組成的數組再加上一個整數指明緩衝區長度。並無如何將位元組轉換成字元的資訊,這是由程式員來決定的。字串由什麼值來組成並無限制;特別的,其值為 0 的位元組可以處於字串任何位置。
由於 PHP 並不特別指明字串的編碼,那字串到底是怎樣編碼的呢?例如字串 "á" 到底是等於 "\xE1"(ISO-8859-1),"\xC3\xA1"(UTF-8,C form),"\x61\xCC\x81"(UTF-8,D form)還是任何其它可能的表達呢?答案是字串會被按照該指令檔相同的編碼方式來編碼。
字串的表示
php的字串可以使用4種方式來表示,包括:
單引號/雙引號/heredoc/nowdoc
這4種方式都支援將字串寫成多行,同時,字串中的換行、空格都會原樣保留在字元中,即保持源碼中的格式。如果要消除換行,可以寫成單行的形式,並使用字串拼接運算子。
單引號使用簡單,使用單引號時,逸出字元只有兩個,即\'和\\
如果字串中包含了雙引號,則使用單引號的方式將會十分簡潔。
雙引號則支援更多的逸出字元,比如\n和\t等。此外,逸出字元還支援八進位標記法、十六進位標記法和UTF-8標記法:
\[0-7]{1,3}
\x[0-9A-Fa-f]{1,2}
\u{[0-9A-Fa-f]+}
同樣,雙引號表示的字串中,單引號不用進行轉義。
雙引號表示的字串還有另一個重要的特點,就是會對字串的中變數進行解析:
"Hi, $str."
文法分析器一旦碰到$符號,就會擷取$符號的後面直到下一個不是英文字母、阿拉伯數字或底線的字元之間的字串,將其當成變數名稱,若程式中沒有這個變數,則會自動忽略。
如果要輸出$符號,則必須使用逸出字元\$
heredoc文法
文法格式:
<<<str
字串內容
str
注意,上面的str是一個自訂的標識符(可以添加雙引號),用於輔助標誌字串的開始和結束。此外,<<<str之後必須是一個分行符號。
指定字串結束的標識符必須是另起一行並且從第一列開始書寫。這行除了後面可能有一個分號(;)外,絕對不能包含其它字元。這意味著標識符不能縮排,分號的前後也不能有任何空白或定位字元。更重要的是結束標識符的前面必須是個被本地作業系統認可的換行,比如在 UNIX 和 Mac OS X 系統中是 \n,而結束定界符(可能其後有個分號)之後也必須緊跟一個換行。
heredoc文法與雙引號標記法一樣會對字串中的變數進行解析。
注意,Heredocs 包含變數解析時,不能用來初始化類的屬性。
nowdoc文法
文法格式:
<<<'str'
字串內容
str
nowdoc文法與heredoc文法類似,特點是標識符必須由單引號包圍。而且nowdoc文法不會對字串中的變數進行解析。
<?php $name = "pish"; echo <<<'str1' My name is $name.<br> str1; ?>
字串中的變數解析
最簡單的方式是直接寫變數名,例如:
$name = 'Ann'; $str = "hello $name!";
這種方式必須讓變數名的末尾有一個不能用於變數命名的字元,比如上例中的"!",當然,除非是字串已經結束。
如果變數名後跟的是一個字母或數字,那麼變數就不會得到正確的解析,因為文法分析器一旦碰到$符號,就會擷取$符號的後面直到下一個不是英文字母、阿拉伯數字或底線的字元之間的字串,將其當成變數名稱,若程式中沒有這個變數,則會自動忽略。
一個例外是數組元素,數組元素使用]標識了變數的結束,所以在]之後可以有其他字母或數字。
如果要更好的控制變數名或者使用一個複雜的運算式,則可以使用{}來輔助標識。
注意:
1.$和{必須緊挨在一起,比如:${或{$,否則花括弧就會被解析為字串中的一個一般字元。
2.必須有}符號,否則出錯。
3.如果$符號是挨著變數名的,則它們之間不能有空格。
4.解析數組元素時,只有通過花括弧文法才能正確解析帶引號的鍵名
$str = "hello ${name}"; $str = "hello ${ name }"; $str = "hello {$name }"; $str = "hello {$ name }"; // 出錯
只使用一層花括弧時,無法處理函數或方法的傳回值或者類常量以及類靜態變數。正確的做法是使用兩層花括弧:
{${getName()}} // 函數 {${$object->getName()}} // 方法 {${beers::softdrink}} // 類常量 {${beers::$ale}} // 類變數
下面的例子示範了字串中的可變變數:
$name = 'Ann'; $Ann = 'Jeck'; echo "hello {${$name}}"; // hello Jeck echo "hello ${$name}"; // hello Jeck class foo { var $bar = 'I am bar.'; } $foo = new foo(); $bar = 'bar'; $baz = array('foo', 'bar', 'baz', 'quux'); echo "{$foo->$bar}\n"; // I am bar. echo "{$foo->{$baz[1]}}\n"; // I am bar.
以數組的形式訪問字串
一個字串可以當成一個可讀寫的數組進行訪問,這時,數組的鍵固定為0、1、2...
可以使用方括弧或花括弧來訪問字串中的元素:
$str = "abcdefg"; $str[0] = "2"; $str{1} = 3; echo var_dump($str); // string(7) "23cdefg"
注意,用超出字串長度的下標寫入將會拉長該字串並以空格填充。非整數類型下標會被轉換成整數。非法下標類型會產生一個 E_NOTICE 層級錯誤。用負數下標寫入字串時會產生一個 E_NOTICE 層級錯誤,用負數下標讀取字串時返回Null 字元串。寫入時只用到了賦值字串的第一個字元。用Null 字元串賦值則賦給的值是 NULL 字元。
PHP 的字串在內部是位元組組成的數組。因此用花括弧訪問或修改字串對多位元組字元集很不安全。僅應對單位元組編碼例如 ISO-8859-1 的字串進行此類操作。
運算子
字串支援以下這些運算子:
. .=
該運算子用於串連兩個字串:
$str1 = "hello " . "world"; $str1 .= "!"; echo $str1; // hello world!
字串函數
strlen(str)
返回字串的長度
$str1 = "abcdefg"; $str2 = "大家好!"; echo strlen($str1); // 7 echo strlen($str2); // 10
以上就是本文的所有內容,希望可以給你帶來對字串的新認識哦~
相關推薦:
最全的php字串處理函數
php字串轉換為小寫函數strtolower()
幾個被人遺忘的PHP字串處理函數