string 是一系列字符。在 PHP 中,字符和字節(jié)一樣,也就是說,一共有 256 種不同字符的可能性。這也暗示 PHP 對 Unicode 沒有本地支持。請參閱函數(shù) utf8_encode() 和 utf8_decode() 以了解有關(guān) Unicode 支持。
AD:
變量解析
當用雙引號或者定界符指定字符串時,其中的變量會被解析。
有兩種語法,一種簡單的和一種復雜的。簡單語法最通用和方便,它提供了解析變量,數(shù)組值,或者對象屬性的方法。
復雜語法是 PHP 4 引進的,可以用花括號括起一個表達式。
簡單語法
如果遇到美元符號($),解析器會盡可能多地取得后面的字符以組成一個合法的變量名。如果你想明示指定名字的結(jié)束,用花括號把變量名括起來。
<?php $beer = 'Heineken'; echo "$beer's taste is great"; // works, "'" is an invalid character for varnames echo "He drank some $beers"; // won't work, 's' is a valid character for varnames echo "He drank some ${beer}s"; // works echo "He drank some {$beer}s"; // works ?> |
同樣也可以解析數(shù)組索引或者對象屬性。對于數(shù)組索引,右方括號(])標志著索引的結(jié)束。對象屬性則和簡單變量適用同樣的規(guī)則,盡管對于對象屬性沒有像變量那樣的小技巧。
'red', 'banana' => 'yellow'); // Works but note that this works differently outside string-quotes echo "A banana is $fruits[banana]."; // Works echo "A banana is {$fruits['banana']}."; // Works but PHP looks for a constant named banana first // as described below. echo "A banana is {$fruits[banana]}."; // Won't work, use braces. This results in a parse error. echo "A banana is $fruits['banana']."; // Works echo "A banana is " . $fruits['banana'] . "."; // Works echo "This square is $square->width meters broad."; // Won't work. For a solution, see the complex syntax. echo "This square is $square->width00 centimeters broad."; |
對于任何更復雜的情況,應該使用復雜語法。
復雜(花括號)語法
不是因為語法復雜而稱其為復雜,而是因為用此方法可以包含復雜的表達式。
事實上,用此語法你可以在字符串中包含任何在名字空間的值。僅僅用和在字符串之外同樣的方法寫一個表達式,然后用 { 和 } 把它包含進來。因為不能轉(zhuǎn)義“{”,此語法僅在 $ 緊跟在 { 后面時被識別(用“{$”或者“{$”來得到一個字面上的“{$”)。用一些例子可以更清晰:
<?php // Let's show all errors error_reporting(E_ALL); $great = 'fantastic'; // 不行,輸出為:This is { fantastic} echo "This is { $great}"; // 可以,輸出為:This is fantastic echo "This is {$great}"; echo "This is ${great}"; // Works echo "This square is {$square->width}00 centimeters broad."; // Works echo "This works: {$arr[4][3]}"; // This is wrong for the same reason as $foo[bar] is wrong // outside a string. In otherwords, it will still work but // because PHP first looks for a constant named foo, it will // throw an error of level E_NOTICE (undefined constant). echo "This is wrong: {$arr[foo][3]}"; // Works. When using multi-dimensional arrays, always use // braces around arrays when inside of strings echo "This works: {$arr['foo'][3]}"; // Works. echo "This works: " . $arr['foo'][3]; echo "You can even write {$obj->values[3]->name}"; echo "This is the value of the var named $name: {${$name}}"; ?> |
訪問字符串中的字符
字符串中的字符可以通過在字符串之后用花括號指定所要字符從零開始的偏移量來訪問。
注: 為了向下兼容,仍然可以用方括號。不過此語法在 PHP 4 中不贊成使用。
例子 11-3. 一些字符串例子
<?php // Get the first character of a string $str = 'This is a test.'; $first = $str{0}; // Get the third character of a string $third = $str{2}; // Get the last character of a string. $str = 'This is still a test.'; $last = $str{strlen($str)-1}; ?> |
實用函數(shù)及操作符
字符串可以用“.”(點)運算符連接。注意這里不能用“+”(加)運算符。更多信息參見字符串運算符。
有很多實用函數(shù)來改變字符串。
普通函數(shù)見字符串函數(shù)庫一節(jié),高級搜索和替換見正則表達式函數(shù)(兩種口味:Perl 和 POSIX 擴展)。
還有 URL 字符串函數(shù),以及加密/解密字符串的函數(shù)(mcrypt 和 mhash)。
最后,如果還是找不到你要的函數(shù),參見字符類型函數(shù)庫。
字符串轉(zhuǎn)換
您可以用 (string) 標記或者 strval() 函數(shù)將一個值轉(zhuǎn)換為字符串。當某表達式需要字符串時,字符串的轉(zhuǎn)換會在表達式范圍內(nèi)自動完成。例如當你使用 echo() 或者 print() 函數(shù)時,或者將一個變量值與一個字符串進行比較的時候。閱讀手冊中有關(guān)類型和類型戲法中的部分有助于更清楚一些。參見 settype()。
布爾值 TRUE 將被轉(zhuǎn)換為字符串 “1”,而值 FALSE 將被表示為 “”(即空字符串)。這樣您就可以隨意地在布爾值和字符串之間進行比較。
整數(shù)或浮點數(shù)數(shù)值在轉(zhuǎn)換成字符串時,字符串即為表示這些數(shù)值數(shù)字(浮點數(shù)還包含有指數(shù)部分)。
數(shù)組將被轉(zhuǎn)換成字符串 “Array”,因此您無法通過 echo() 或者 print() 函數(shù)來輸出數(shù)組的內(nèi)容。請參考下文以獲取更多提示。
對象將被轉(zhuǎn)換成字符串 “Object”。如果您因為調(diào)試需要,需要將對象的成員變量打印出來,請閱讀下文。如果您希望得到該對象所依附的類的名稱,請使用函數(shù) get_class()。
資源類型將會以 “Resource id #1” 的格式被轉(zhuǎn)換成字符串,其中 1 是 PHP 在運行時給資源指定的唯一標識。如果您希望獲取資源的類型,請使用函數(shù) get_resource_type().
NULL 將被轉(zhuǎn)換成空字符串。
正如以上所示,將數(shù)組、對象或者資源打印出來,并不能給您提供任何關(guān)于這些值本身的有用的信息。請參閱函數(shù) print_r() 和 var_dump(),對于調(diào)試來說,這些是更好的打印值的方法。
您可以將 PHP 的值轉(zhuǎn)換為字符串以永久地儲存它們。這種方法被稱為串行化,您可以用函數(shù) serialize() 來完成該操作。如果您在安裝 PHP 時建立了 WDDX 支持,您還可以將 PHP 的值串行化為 XML 結(jié)構(gòu)。
字符串轉(zhuǎn)換為數(shù)值
當一個字符串被當作數(shù)字來求值時,根據(jù)以下規(guī)則來決定結(jié)果的類型和值。
如果包括“.”,“e”或“E”其中任何一個字符的話,字符串被當作 float 來求值。否則就被當作整數(shù)。
該值由字符串最前面的部分決定。如果字符串以合法的數(shù)字數(shù)據(jù)開始,就用該數(shù)字作為其值,否則其值為 0(零)。合法數(shù)字數(shù)據(jù)由可選的正負號開始,后面跟著一個或多個數(shù)字(可選地包括十進制分數(shù)),后面跟著可選的指數(shù)。指數(shù)是一個“e”或者“E”后面跟著一個或多個數(shù)字。
<?php $foo = 1 + "10.5"; // $foo is float (11.5) $foo = 1 + "-1.3e3"; // $foo is float (-1299) $foo = 1 + "bob-1.3e3"; // $foo is integer (1) $foo = 1 + "bob3"; // $foo is integer (1) $foo = 1 + "10 Small Pigs"; // $foo is integer (11) $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2) $foo = "10.0 pigs " + 1; // $foo is float (11) $foo = "10.0 pigs " + 1.0; // $foo is float (11) ?> |
此轉(zhuǎn)換的更多信息見 Unix 手冊中關(guān)于 strtod(3) 的部分。
如果你想測試本節(jié)中的任何例子,可以拷貝和粘貼這些例子并且加上下面這一行自己看看會發(fā)生什么:
<?php echo "$foo==$foo; type is " . gettype ($foo) . " n"; ?> |
不要指望在將一個字符轉(zhuǎn)換成整型時能夠得到該字符的編碼(您可能也會在 C 中這么做)。如果您希望在字符編碼和字符之間轉(zhuǎn)換,請使用 ord() 和 chr() 函數(shù)。