有4種定義方式:1、用單引號包裹字元,語法「'字元內容'」;2、用雙引號包裹字元,語法「"字元內容"」;3、用heredoc結構,語法「<<<EOF 字元內容 EOF;」;4、用nowdoc結構,語法「<<<'EOD' 字元內容 EOD;」。Nowdoc和heredoc類似,但它中不進行變數解析操作;這種結構很適合用於嵌入PHP程式碼或其它大段文字而無需對其中的特殊字元進行跳脫。
本教學操作環境:windows7系統、PHP8.1版、DELL G3電腦
字串是連續的字元序列,在其它語言中,字元和字串是兩種不同的資料型別,但在 PHP 中,統一將字元和字串當作字串資料型別。
在 PHP 中,定義字串有4種方式,分別是單引號方式、雙引號方式、Heredoc 方式、nowdoc 方式。
「單引號」定義方式
定義一個字串的最簡單的方法是用單引號把它包圍起來(字元 ')。
要表達一個單引號自身,需在它的前面加個反斜線(\)來跳脫。要表達一個反斜線自身,則用兩個反斜線(\\)。其它任何方式的反斜線都會被當成反斜線本身:也就是說如果想使用其它跳脫序列例如 \r 或者 \n,並不代表任何特殊含義,就單純是這兩個字元本身。
注意: 不像雙引號和 heredoc 語法結構,在單引號字串中的變數和特殊字元的跳脫序列將不會被替換。
範例:
<?php echo 'this is a simple string'; echo '<br>'; // 可以錄入多行 echo 'You can also have embedded newlines in strings this way as it is okay to do'; echo '<br>'; // 輸出: Arnold once said: "I'll be back" echo 'Arnold once said: "I\'ll be back"'; echo '<br>'; // 輸出: You deleted C:\*.*? echo 'You deleted C:\\*.*?'; echo '<br>'; // 輸出: You deleted C:\*.*? echo 'You deleted C:\*.*?'; echo '<br>'; // 輸出: This will not expand: \n a newline echo 'This will not expand: \n a newline'; echo '<br>'; // 輸出: Variables do not $expand $either echo 'Variables do not $expand $either'; echo '<br>'; ?>
「雙引號」定義方式
如果字串是包圍在雙引號(")中, PHP 將對以下特殊的字元進行解析:
序列 | 含義 |
---|---|
\n | 換行(ASCII 字元集中的 LF 或 0x0A (10)) |
\r | 回車(ASCII 字元集中的 CR 或 0x0D (13)) |
\t | 水平製表符(ASCII 字元集中的 HT 或 0x09 (9)) |
\v | 垂直製表符(ASCII 字元集中的 VT 或 0x0B (11)) |
\e | Escape(ASCII 字元集中的 ESC 或 0x1B (27)) |
\f | 換頁(ASCII 字元集中的 FF 或 0x0C (12)) |
\\ | 反斜線 |
\$ | 美元標記 |
\" | 雙引號 |
\[0-7]{1,3} | 符合該正規表示式序列的是一個以八進位制方式來表達的字元,which silently overflows to fit in a byte (e.g. "\400" === "\000") |
\x[0-9A-Fa-f]{1,2} | 符合該正規表示式序列的是一個以十六進位制方式來表達的字元 |
\u{[0-9A-Fa-f]+} | 匹配正規表示式的字元序列是 unicode 碼位, 該碼位能作為 UTF-8 的表達方式輸出字串 |
和單引號字串一樣,跳脫任何其它字元都會導致反斜線被顯示出來。
用雙引號定義的字串最重要的特徵是變數會被解析,即變數解析。
範例:
<?php echo "this is a simple string"; echo "<br>"; // 也可以錄入多行 echo "You can also have embedded newlines in strings this way as it is okay to do"; ?>
「Heredoc」定義方式
第三種表達字串的方法是用 heredoc 句法結構:<<<。在該運運算元之後要提供一個識別符號,然後換行。接下來是字串 string 本身,最後要用前面定義的識別符號作為結束標誌。
結束識別符號可以使用空格或製表符(tab)縮排,此時檔案字串會刪除所有縮排。 在 PHP 7.3.0 之前的版本中,結束時所參照的識別符號必須在該行的第一列。
而且,識別符號的命名也要像其它標籤一樣遵守 PHP 的規則:只能包含字母、數位和下劃線,並且必須以字母和下劃線作為開頭。
<?php $str = <<<EOF url: https://www.php.cn/ EOF; echo $str; ?>
PHP 7.3.0 之後的基礎 Heredoc 範例
<?php // 無縮排 echo <<<END a b c \n END; // 4 空格縮排 echo <<<END a b c END;
如果結束識別符號的縮排超過內容的任何一行的縮排,則將丟擲 ParseError 異常:
範例:結束識別符號的縮排不能超過正文的任何一行
<?php echo <<<END a b c END;
以上例程在 PHP 7.3 中的輸出:
PHP Parse error: Invalid body indentation level (expecting an indentation level of at least 3) in example.php on line 4
製表符也可以縮排結束識別符號,但是,關於縮排結束識別符號和內容, 製表符和空格不能混合使用。在以上任何情況下, 將會丟擲 ParseError 異常。 之所以包含這些空白限制,是因為混合製表符和空格來縮排不利於易讀性。
範例:內容(空白)和結束識別符號的不同縮排
<?php // 以下所有程式碼都不起作用。 // 正文(空格)和結束標記(製表符),不同的縮排 { echo <<<END a END; } // 在正文中混合空格和製表符 { echo <<<END a END; } // 在結束標記中混合空格和製表符 { echo <<<END a END; }
以上例程在 PHP 7.3 中的輸出:
PHP Parse error: Invalid indentation - tabs and spaces cannot be mixed in example.php line 8
內容字串的結束識別符號後面不需要跟分號或者換行符。 例如,從 PHP 7.3.0 開始允許以下程式碼:
範例:在結束識別符號後繼續表示式
<?php $values = [<<<END a b c END, 'd e f']; var_dump($values);
以上例程在 PHP 7.3 中的輸出:
array(2) { [0] => string(11) "a b c" [1] => string(5) "d e f" }
「Nowdoc」定義方式
就象 heredoc 結構類似於雙引號字串,Nowdoc 結構是類似於單引號字串的。Nowdoc 結構很象 heredoc 結構,但是 nowdoc 中不進行解析操作。這種結構很適合用於嵌入 PHP 程式碼或其它大段文字而無需對其中的特殊字元進行跳脫。與 SGML 的 <![CDATA[ ]]> 結構是用來宣告大段的不用解析的文字類似,nowdoc 結構也有相同的特徵。
一個 nowdoc 結構也用和 heredocs 結構一樣的標記 <<<, 但是跟在後面的識別符號要用單引號括起來,即 <<<'EOT'。Heredoc 結構的所有規則也同樣適用於 nowdoc 結構,尤其是結束識別符號的規則。
範例:
<?php echo <<<'EOD' Example of string spanning multiple lines using nowdoc syntax. Backslashes are always treated literally, e.g. \\ and \'. EOD;
<?php /* 含有變數的更復雜的範例 */ class foo { public $foo; public $bar; function __construct() { $this->foo = 'Foo'; $this->bar = array('Bar1', 'Bar2', 'Bar3'); } } $foo = new foo(); $name = 'MyName'; echo <<<'EOT' My name is "$name". I am printing some $foo->foo. Now, I am printing some {$foo->bar[1]}. This should not print a capital 'A': \x41 EOT; ?>
注意:
Nowdoc 結構是在 PHP 5.3.0 中加入的。
擴充套件知識:變數解析
當字串用雙引號或 heredoc 結構定義時,其中的變數將會被解析。
這裡共有兩種語法規則:一種簡單規則,一種複雜規則。簡單的語法規則是最常用和最方便的,它可以用最少的程式碼在一個 string 中嵌入一個變數,一個 array 的值,或一個 object 的屬性。
複雜規則語法的顯著標記是用花括號包圍的表示式。
簡單語法
當 PHP 解析器遇到一個美元符號($)時,它會和其它很多解析器一樣,去組合儘量多的標識以形成一個合法的變數名。可以用花括號來明確變數名的界線。
<?php $juice = "apple"; echo "He drank some $juice juice.".PHP_EOL; // Invalid. "s" is a valid character for a variable name, but the variable is $juice. echo "He drank some juice made of $juices."; // Valid. Explicitly specify the end of the variable name by enclosing it in braces: echo "He drank some juice made of ${juice}s."; ?>
類似的,一個 array 索引或一個 object 屬性也可被解析。陣列索引要用方括號(])來表示索引結束的邊際,物件屬性則是和上述的變數規則相同。
<?php $juices = array("apple", "orange", "koolaid1" => "purple"); echo "He drank some $juices[0] juice.".PHP_EOL; echo "He drank some $juices[1] juice.".PHP_EOL; echo "He drank some $juices[koolaid1] juice.".PHP_EOL; class people { public $john = "John Smith"; public $jane = "Jane Smith"; public $robert = "Robert Paulsen"; public $smith = "Smith"; } $people = new people(); echo "$people->john drank some $juices[0] juice.".PHP_EOL; echo "$people->john then said hello to $people->jane.".PHP_EOL; echo "$people->john's wife greeted $people->robert.".PHP_EOL; echo "$people->robert greeted the two $people->smiths."; // Won't work ?>
從 PHP 7.1.0 起,還支援負數位索引。
<?php $string = 'string'; echo "The character at index -2 is $string[-2].", PHP_EOL; $string[-3] = 'o'; echo "Changing the character at index -3 to o gives $string.", PHP_EOL; ?>
如果想要表達更復雜的結構,請用複雜語法。
複雜(花括號)語法
複雜語法不是因為其語法複雜而得名,而是因為它可以使用複雜的表示式。
任何具有 string 表達的標量變數,陣列單元或物件屬性都可使用此語法。 表示式的書寫方式與在 string 以外的方式相同, 然後用花括號 { 和 } 把它括起來即可。由於 { 無法被跳脫,只有 $ 緊挨著 { 時才會被識別。可以用 {\$ 來表達 {$。下面的範例可以更好的解釋:
<?php // 顯示所有錯誤 error_reporting(E_ALL); $great = 'fantastic'; // 無效,輸出: This is { fantastic} echo "This is { $great}"; // 有效,輸出: This is fantastic echo "This is {$great}"; // 有效 echo "This square is {$square->width}00 centimeters broad."; // 有效,只有通過花括號語法才能正確解析帶引號的鍵名 echo "This works: {$arr['key']}"; // 有效 echo "This works: {$arr[4][3]}"; // 這是錯誤的表示式,因為就象 $foo[bar] 的格式在字串以外也是錯的一樣。 // 換句話說,只有在 PHP 能找到常數 foo 的前提下才會正常工作;這裡會產生一個 // E_NOTICE (undefined constant) 級別的錯誤。 echo "This is wrong: {$arr[foo][3]}"; // 有效,當在字串中使用多重陣列時,一定要用括號將它括起來 echo "This works: {$arr['foo'][3]}"; // 有效 echo "This works: " . $arr['foo'][3]; echo "This works too: {$obj->values[3]->name}"; echo "This is the value of the var named $name: {${$name}}"; echo "This is the value of the var named by the return value of getName(): {${getName()}}"; echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}"; // 無效,輸出: This is the return value of getName(): {getName()} echo "This is the return value of getName(): {getName()}"; // 無效, 輸出: C:\folder\{fantastic}.txt echo "C:\folder\{$great}.txt" // 有效, 輸出: C:\folder\fantastic.txt echo "C:\\folder\\{$great}.txt" ?>
也可以在字串中用此語法通過變數來呼叫類的屬性。
<?php class foo { var $bar = 'I am bar.'; } $foo = new foo(); $bar = 'bar'; $baz = array('foo', 'bar', 'baz', 'quux'); echo "{$foo->$bar}\n"; echo "{$foo->{$baz[1]}}\n"; ?>
注意:
函數、方法、靜態類變數和類常數可使用 {$} ,在該字串被定義的名稱空間中將其值作為變數名來存取。只單一使用花括號 ({}) 無法處理從函數或方法的返回值或者類常數以及類靜態變數的值。
推薦學習:《》
以上就是php字串有哪幾種定義方式的詳細內容,更多請關注TW511.COM其它相關文章!