關於 PHP 字串跟引號

這幾天寫 PHP 的時候,我的組員突然想看起我的程式碼
結果他說他有點困擾我程式碼中的引號
我想主要是因為 SQL 字串也是需要引號,讓一堆引號出現在字串裡令人困惑

我想應該寫點有關引號的部份,不過這篇主要的目的並不會著重於 PHP 字串的底層機制

PHP 字串表示法

PHP 的字串宣告如同下方

$str = 'hello world' // 單引號表示
$str = "hello world" // 雙引號表示

如此一來 php 就能理解這個變數是個字串變數,那為什麼可以單引號以及雙引號呢?
這必須牽涉到如果你的字串裡頭真的也想放入 ' 或者 " 這兩種引號那必須如何表示呢?

以下我們將以 sql 字串 select * from user_profile where account='FreedomKnight' 為例子
在 sql 語法中上面的字串也可以換成 select * from user_profile where account="FreedomKnight"

早期 C 語言的解法是

sql = "select * from user_profile where account="FreedomKnight"";

早期就是利用反斜線來指名「我就是要那個引號當字元」,我想大家寫久了應該就會發現一個問題
如果我裡面要放很多引號,那不就是會出現一堆斜線海?

因此,後來的語言如 python, php, javascript, bash 同時可以讓兩種引號來宣告一個字串
只要遵循一個原則「用什麼引號開始,就用什麼引號結束」

例如

$sql = "select * from user_profile where  account='FreedomKnight'";
或者
$sql = 'select * from user_profile where  account="FreedomKnight"';

如此一來不但不會有斜線海,也能清楚的看懂程式碼了。
只不過兩者有一個小差異,「如果雙引號裡出現之前宣告過的變數,他會自動幫你換上變數的值」

例如

$account = 'FreedomKnight'
$sql = "select * from user_profile where account='$account'";
echo $sql;

顯示
select * from user_profile where account='FreedomKnight'

如果為單引號
$account = 'FreedomKnight'
$sql = 'select * from user_profile where account=$account';
echo $sql; 

螢幕上會顯示
select * from user_profile where account=$account

上面單引號的例子,我並沒有把 $account 再用單引號括起來,除了舉例方便之外,還有個隱憂

 $sql = 'select * from user_profile where account='$account'';

如果各位是 php 的直譯器,會怎麼去辨別上面的字串? 記得剛剛說的原則嗎?
「用什麼引號開始,就用什麼引號結束」
那我們的字串將會拆成 'select * from user_profile where account=', $account, '$account'
這樣根本不成模樣,因此在使用上必須注意這幾點