php字串有哪幾種定義方式

2022-06-30 22:02:05

有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>';
?>

1.png

「雙引號」定義方式

如果字串是包圍在雙引號(")中, PHP 將對以下特殊的字元進行解析:

跳脫字元
序列含義
\n換行(ASCII 字元集中的 LF 或 0x0A (10))
\r回車(ASCII 字元集中的 CR 或 0x0D (13))
\t水平製表符(ASCII 字元集中的 HT 或 0x09 (9))
\v垂直製表符(ASCII 字元集中的 VT 或 0x0B (11))
\eEscape(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";
?>

2.png

「Heredoc」定義方式

第三種表達字串的方法是用 heredoc 句法結構:<<<。在該運運算元之後要提供一個識別符號,然後換行。接下來是字串 string 本身,最後要用前面定義的識別符號作為結束標誌。

結束識別符號可以使用空格或製表符(tab)縮排,此時檔案字串會刪除所有縮排。 在 PHP 7.3.0 之前的版本中,結束時所參照的識別符號必須在該行的第一列。

而且,識別符號的命名也要像其它標籤一樣遵守 PHP 的規則:只能包含字母、數位和下劃線,並且必須以字母和下劃線作為開頭。

<?php
$str = <<<EOF
  url:
  https://www.php.cn/
EOF;
echo $str;
?>

3.png

PHP 7.3.0 之後的基礎 Heredoc 範例

<?php
// 無縮排
echo <<<END
      a
     b
    c
\n
END;
// 4 空格縮排
echo <<<END
      a
     b
    c
    END;

4.png

如果結束識別符號的縮排超過內容的任何一行的縮排,則將丟擲 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;

9.png

<?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;
?>

10.png

注意:

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.";
?>

5.png

類似的,一個 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
?>

6.png

從 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;
?>

7.png

如果想要表達更復雜的結構,請用複雜語法。

複雜(花括號)語法

複雜語法不是因為其語法複雜而得名,而是因為它可以使用複雜的表示式。

任何具有 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";
?>

8.png

注意:

函數、方法、靜態類變數和類常數可使用 {$} ,在該字串被定義的名稱空間中將其值作為變數名來存取。只單一使用花括號 ({}) 無法處理從函數或方法的返回值或者類常數以及類靜態變數的值。

推薦學習:《》

以上就是php字串有哪幾種定義方式的詳細內容,更多請關注TW511.COM其它相關文章!