PHP 字符串淺析

一、定義

String 字符串 : 一個字符串 string 就是由一系列的字符組成,其中每個字符等同於一個字節,需要書寫在定界符中。這意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。

二、語法

一個字符串可以用 4 種方式表達:

  1. 單引號
  2. 雙引號
  3. heredoc 語法結構
  4. nowdoc 語法結構(自 PHP 5.3.0 起)

單引號

定義一個字符串的最簡單的方法是用單引號把它包圍起來 ‘字符’。

$Username = 'Stussy';
echo 'Stussy';      // Stussy
echo '$Username';      // $Username 不解析變量

若字符串中出現與定界符相同的字符,需用\進行轉義,常用轉義符見下表
(*注意:\和\’在單引號中依然解析)

echo 'Stussy's computer';   //Parse Error
echo 'Stussy\'s computer';   //Stussy's computer 
echo 'Stussy says "Hello!"';  //Stussy says "Hello!"

要表達一個單引號自身,需在它的前面加個反斜線(\)來轉義。要表達一個反斜線自身,則用兩個反斜線(\)。其它任何方式的反斜線都會被當成反斜線本身:也就是說如果想使用其它轉義序列例如 \r 或者 \n,並不代表任何特殊含義,就單純是這兩個字符本身。

如果字符串中無需解析,使用’ ‘將提高效率

雙引號

如果字符串是包圍在雙引號 “” 中, PHP 將對一些特殊的字符進行解析:

序列 含義
\n 換行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回車(ASCII 字符集中的 CR 或 0x0D (13))
\t 水平製表符(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} 符合該正則表達式序列的是一個以十六進制方式來表達的字符


$Username = 'Stussy';
echo "Stussy";          // Stussy  
echo "$Username";      // Stussy  解析變量

若字符串中出現與定界符相同的字符,需用\進行轉義

echo "Stussy says "Hello!"";    //Error
echo "Stussy says \"Hello!\"";   //Stussy says "Hello!"
echo "$Username says \"Hello!\"";   //Stussy says "Hello!"

heredoc結構(相當於雙引號“”)

第三種表達字符串的方法是用 heredoc 句法結構:<<<。在該運算符之後要提供一個標識符,然後換行。接下來是字符串 string 本身,最後要用前面定義的標識符作爲結束標誌。
(注:標識名稱只能包含字母、數字、下劃線,並且必須以字母和下劃線開始,結束符前不能有任何內容)

<<< 標識名稱
    內容
    標識名稱;

結束時所引用的標識符必須在該行的第一列,而且,標識符的命名也要像其它標籤一樣遵守 PHP 的規則:只能包含字母、數字和下劃線,並且必須以字母和下劃線作爲開頭。

//heredoc用法
$username = 'Disel';
$desc = '"Very Good!"';

$table = <<<EOF        //php5.3之後 可使用雙引號來聲明標識符
<table border='1px solid black'>
    <tr>
        <td>編號</td>
        <td>用戶名</td>
        <td>描述</td>
    </tr>
    <tr>
        <td>1</td>
        <td>Stussy</td>
        <td>"Hello World!"</td>
    </tr>
    <tr>
        <td>2</td>
        <td>{$username}</td>
        <td>{$desc}</td>
    </tr>
</table>

EOF;

echo $table;   

得到用戶表:

編號 用戶名 描述
1 Stussy “Hello World!”
2 Disel “Very Good!”


Nowdoc 結構 (相當於單引號‘’)

就象 heredoc 結構類似於雙引號字符串,Nowdoc 結構是類似於單引號字符串的。Nowdoc 結構很象 heredoc 結構,但是 nowdoc 中不進行解析操作。這種結構很適合用於嵌入 PHP 代碼或其它大段文本而無需對其中的特殊字符進行轉義。

一個 nowdoc 結構也用和 heredocs 結構一樣的標記 <<<, 但是跟在後面的標識符要用單引號括起來,即 <<<’EOT’。Heredoc 結構的所有規則也同樣適用於 nowdoc 結構,尤其是結束標識符的規則。

//nowdoc用法
$username = 'Disel';
$str=<<<'EOD'
    hello Stussy<br/>
    {$username}
EOD;

得到:

hello Stussy
{$username}

變量解析

當 PHP 解析器遇到一個美元符號($)時,它會和其它很多解析器一樣,去組合儘量多的標識以形成一個合法的變量名。可以用花括號來明確變量名的界線。

$Username = 'Stussy';
echo "My name is $Username ";  //My name is Stussy
echo 'My name is $Username'; 	//My name is $Username
echo "My name is $Username1";  //Error
echo "My name is $Username 1";  //My name is Stussy 1
echo "My name is {$Username}1"; //My name is Stussy1

*注: { }內之間不要留空格{ $Username}、{$Username }或{ $Username }

任何具有 string 表達的標量變量,數組單元或對象屬性都可使用此語法。只需簡單地像在 string 以外的地方那樣寫出表達式,然後用花括號 { 和 } 把它括起來即可。由於 { 無法被轉義,只有 $ 緊挨着 { 時纔會被識別。可以用 {\來表達 {

通過{ }操作字符串的內容,下標從0開始

$str = 'abcdefg';
echo $str{0};      // a
//替換
$str{2} = 'z';     //只能一個字符修改一個字符'c'=>'z'
echo $str;         // abzdefg
$str{2} = 'zoo';
echo $str;        // abzdefg
$str = '你好';      //中文在utf-8中佔3個字節
//刪除
$str = 'abcdef' ;
$str{2} = '';      //使用''替換'c'
echo $str;        //abdef
var_dump($str);    //string(6)"abdef" 長度不變 'c'變爲''空字符串
//增加
$str = 'abc';
$str{3} = 'd';
echo $str;  	   //abcd 添加'd'到$str
$str = 'abc';
$str{6} ='d';
echo $str;        //abc d 源代碼中:abc   d

//隨機數
$str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$num='1234567890';
echo $str{mt_rand(0,strlen($str)-1)};   //$str中隨機一個字符
echo $str{mt_rand(0,strlen($str)-1)}.$num{mt_rand(0,strlen($num)-1)}.$str{mt_rand(0,strlen($str)-1)}.$num{mt_rand(0,strlen($num)-1)};      //隨機生成A1A1類型的字符串驗證碼;

三、數據類型轉換成字符串

一個值可以通過在其前面加上 (string) 或用 strval() 函數來轉變成字符串。在一個需要字符串的表達式中,會自動轉換爲 string。比如在使用函數 echo 或 print 時,或在一個變量和一個 string 進行比較時,就會發生這種轉換。類型和類型轉換可以更好的解釋下面的事情,也可參考函數 settype()。

1. 自動轉換

integer/float => string

echo 123;                       //123
echo 3.1415926;                 //3.1415926

boolean => string

echo TRUE;                      //1
echo FALSE;                     //空字符串
echo null;                      //空字符串

array => string

$arr = array(1,2,3);
echo $arr;                     //數組 array 總是轉換成字符串 "Array"

resource => string

$handle = fopen('1.php', 'r');
echo $handle;                  //Resource id #3

object => string

$obj = new Class;
echo $obj;                     //error could not be converted to string

2. 臨時轉換

(string)$var

$var = 123;
$res = (string)$var;
var_dump($res);                    //string(3) "123"

其他類型結果同自動轉換

strval()

$var = 123;
$res = strval($var);
var_dump($res);                    //string(3) "123"

其他類型結果同自動轉換

3. 永久轉換

settype($var,type);                //設置數據類型
gettype($var);                     //得到數據類型

舉例:

$var = 123;
settype($var,'string');
var_dump($var);                    //string(3) "123"

四、字符串轉換成其他數據類型

string => integer/float

如果該字符串沒有包含 ‘.’,’e’ 或 ‘E’ 並且其數字值在整型的範圍之內(由 PHP_INT_MAX 所定義),該字符串將被當成 integer 來取值。其它所有情況下都被作爲 float 來取值。

該字符串的開始部分決定了它的值。如果該字符串以合法的數值開始,則使用該數值。否則其值爲 0(零)。合法數值由可選的正負號,後面跟着一個或多個數字(可能有小數點),再跟着可選的指數部分。指數部分由 ‘e’ 或 ‘E’ 後面跟着一個或多個數字構成。

$foo = 1 + "10.5";                // float (11.5)
$foo = 1 + "-1.3e3";              // float (-1299)
$foo = 1 + "bob-1.3e3";           // integer (1)
$foo = 1 + "bob3";                // integer (1)
$foo = 1 + "10 Small Pigs";       // integer (11)
$foo = 4 + "10.2 Little Piggies"; // float (14.2)
$foo = "10.0 pigs " + 1;          // float (11)
$foo = "10.0 pigs " + 1.0;        // float (11)     

string => boolean

空字符串、”0”、’0’ -> false
補充:boolean false
- 布爾值 FALSE 本身
- 整型值 0(零)
- 浮點型值 0.0(零)
- 空字符串,以及字符串 “0”
- 不包括任何元素的數組
- 特殊類型 NULL(包括尚未賦值的變量)
- 從空標記生成的 SimpleXML 對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章