您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“php字符串的定義方式有哪些”,內容詳細,步驟清晰,細節處理妥當,希望這篇“php字符串的定義方式有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
有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: http://www.5655pk.com/ 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字符串的定義方式有哪些”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。