PHP美元與花括號的組合

2021-06-22 04:01:19 字數 1944 閱讀 6515

提及這種用法,還得先說一下php的string型別

php.net上指出,乙個字串可以用4種方式表達:單引號,雙引號,heredoc語法結構,nowdoc語法結構

這裡heredoc語法結構和雙引號形式類似,同樣nowdoc結構對應單引號

單引號:單引號包圍起來的字串中,單引號必須轉義才能使用(\'),否則會報語法錯誤;而用於轉義的反斜線自身,則要用兩個反斜線(\\),即也需要轉義. 文件說"其他任何形式的反斜線都被當成反斜線本身:也就是說如果想使用其它轉義序列例如 \r 或者 \n,並不代表任何特殊含義,就單純是這兩個字元本身",這就是說單引號包圍起來的其他轉義序列根本沒有實現轉義.

反過來說,\是可以直接作為反斜線使用的,因此單引號包圍的字串中\\和\其實都能表示反斜線本身,驗證例項如下:

<?php

echo 'you deleted c:\\*.*?';

echo 'you deleted c:\*.*?';

echo 'this will not expand: \n a newline';

echo 'variables do not $expand $either';

?>

雙引號:當字串包圍在雙引號中,php會對一些特殊字元解析,這裡\n,\r,\t都正常解析為轉義符,而且反斜線、美元符、雙引號都需要轉義:\\, \$, \"

heredoc和nowdoc不如引號用起來方便,但是可以實現相同的目的

再說變數解析,文件的說法是當字串遇到雙引號或heredoc結構定義時,其中的變數將會被解析;變數解析有兩種語法規則,簡單的和複雜的,其中複雜規則的顯著標記是用花括號包圍的表示式;

對於簡單規則而言,當 php 解析器遇到乙個美元符號($)時,它會和其它很多解析器一樣,去組合盡量多的標識以形成乙個合法的變數名。可以用花括號來明確變數名的界線。

<?php

echo "he drank some juice made of $s.";

?>

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

任何具有 string 表達的標量變數,陣列單元或物件屬性都可使用此語法。只需簡單地像在 string 以外的地方那樣寫出表示式,然後用花括號 把它括起來即可。由於

echo "this is ";

// 有效,輸出: this is fantastic

echo "this is ";

echo "this is $";

echo "this is the value of the var named $name: }";

?>

複製**

測試得到以上兩條echo變數great的語句輸出同樣的結果,所以}其實和}也是一樣的

另外,php.net的文件中給出了note:

"函式、方法、靜態類變數和類常量只有在 php 5 以後才可在 中使用。然而,只有在該字串被定義的命名空間中才可以將其值作為變數名來訪問。只單一使用花括號 ({}) 無法處理從函式或方法的返回值或者類常量以及類靜態變數的值。"

這裡說的很清楚,只有單一{}無法處理返回值等,因為像name只是得到變數的名字,告訴我們這是變數name,即得到乙個name,假如我需要$name的值,那我就得對他再解析一次

所以像:

實現的方法是傳入引數:str=}

這裡如果直接上phpinfo(),由於有addslashes的作用會出現\"的情況使得命令無法執行

$告訴我們最裡面這個是變數,名為phpinfo(),接下來的一層花括號將其解析為字串"phpinfo()"

另外,{}有時候也可以當使用,文件中有說明:"note: string 也可用花括號訪問,比如 str42",這裡str==$str[42]

在《白帽子講web安全》一書中也提到了同樣的應用:

」php的curly systax能導致**執行,它將執行花括號間的**,並將結果替換回去,如下例:

ls得到執行,列出本地目錄並將結果返回

php中的花括號使用詳解

1.簡單句法規則 用花括號界定變數名,適用於php所有版本,是php系統設定 a flower echo she received some as 無效 字母s會被當成有效的變數名組成元素,但是這裡的變數是 a echo she received some s 有效 echo she receive...

scala霧中風景 2 小括號與花括號

下面的問題,表面上看是小括號與花括號的問題。map方法這樣寫不能編譯通過 scala list 2 map case 2 ok 換做花括號就可以了 scala list 2 map不了解原因的話,覺得很詭異。分析一下,首先,map方法接受乙個函式,這個函式將list中的元素對映為其他型別。實際上ca...

vector中的圓括號和花括號

1.圓括號和花括號 include include include using namespace std int main vectorv int2 10 cout vector v int endl for auto i v int cout i endl cout endl cout vect...