這幾天寫 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'
這樣根本不成模樣,因此在使用上必須注意這幾點