在PHP中單引號和雙引號並非是互連的,具體區別如下:
” ” 雙引號裡面的欄位會經過編譯器解釋,然後再當作HTML代碼輸出。
‘ ‘ 單引號裡面的不進行解釋,直接輸出。
從字面意思上就可以看出,單引號比雙引號要快了。
例如:
$abc=’my name is tome’;
echo $abc //結果是:my name is tom
echo ‘$abc’ //結果是:$abc
echo “$abc” //結果是:my name is tom
在SQL語句中
這是會經常遇到的問題,在插入資料庫的SQL語句是採用單引號來定義字串,如果要將一個含有單引號的字串插入資料庫,這個SQL語句就會出錯。
如:$sql="insert into userinfo (username,password) Values('O'Kefee','123456')"
此時,處理的方法之一是在SQL語句中加入轉義符反斜線,
即:……Values('O\'Kefee',……
當然也可以使用函數 addslashes(),該函數的功能就是加入轉義符,
即:$s = addslashes("O'Kefee") ……Values('".$s."',……
還有一種方法是設定php.ini中的magic-quotes選項,開啟該選項,則通過表單提交的資訊中如果有單引號是,將會自動加上如轉義符。因此不用使用其他函數了。
補充: 這就要從雙引號和單引號的作用講起: 雙引號裡面的欄位會經過編譯器解釋然後再當作HTML代碼輸出,但是單引號裡面的不需要解釋,直接輸出。
$val ='a';
sql =" select * from table where name like '%$val%'"; //將自動替換裡面的$val,但如果要用單引號來組織語句則表示為:
sql =' select * from table where name like \'%'.$val.'%\''; //麻煩很多
但用單引號代替雙引號來包含字串,這樣做會更快一些,因為PHP會在雙引號包圍的字串中搜尋變數,單引號則不會。
假設查詢條件中使用的是常量,例如:
select * from abc_table where user_name=’abc’;
SQL語句可以寫成:
SQLstr = “select * from abc_table where user _name= ‘abc’” ;
假設查詢條件中使用的是變數,例如:
$user_name = $_REQUEST['user_name']; //字串變數
或
$user=array (”name”=> $_REQUEST['user_name‘,"age"=>$_REQUEST['age'];//陣列變數
SQL語句就可以寫成:
SQLstr = “select * from abc_table where user_name = ‘ ” . $user_name . ” ‘ “;
SQLstr = “select * from abc_table where user_name = ‘ ” . $user["name"] . ” ‘ “;
對比一下:
SQLstr=”select * from abc_table where user_name = ‘ abc ‘ ” ;
SQLstr=”select * from abc_table where user_name =’ ” . $user _name . ” ‘ “;
SQLstr=”select * from abc_table where user_name =’ ” . $user["name"] . ” ‘ “;
SQLstr可以分解為以下3個部分:
1:”select * from table where user_name = ‘ ” //固定SQL語句
2:$user //變數
3:” ‘ ”
1,2,3部分字串之間用”.” 來串連
PHP效率計:從引號開始(單引號、雙引號效率區別)
實驗一:在普通情況下的效率
我們的實驗是5000次執行10000個位元組的檔案,獲得解析過程中的速度。
首先,本實驗特別規定一個單位,這是為了更好地表示以及排除電腦本身效率的差異。
時間單位 TT,表示約 7.2×10[sup]-8[/sup]s 。
我們獲得四組實驗資料,可理解為表示 'a' 比 "a" 快的時間:
0.29 TT,大概0.0000000206s
0.46 TT,大概0.0000000328s
0.38 TT,大概0.0000000275s
0.41 TT,大概0.0000000292s
平均值:0.39 TT ('aaaa....(139個)' 的效率接近於 "aaa...(100個)" )
結論:在資料量相同,並且在普通情況下(不藉助轉義),使用單引號速度更快。
實驗二:單引號轉義的效率
我們的實驗是5000次分別以「單引號、雙引號」執行兩份資料相同,但其中一份特別用\'表示單引號。
時間單位 TT,表示約 7.2×10[sup]-8[/sup]s 。
我們獲得四組實驗資料,可理解為表示 " ' " 比 ' \' ' 快的時間:
0.19 TT,大概0.0000000138s
0.15 TT,大概0.0000000110s
0.23 TT,大概0.0000000162s
0.24 TT,大概0.0000000173s
平均值:0.2 TT (” ''''...(12個) " 的效率接近於 ' \'\'...(10個)" )
結論:如果字串中需要表示單引號(MySQL查詢),應儘可能避免轉義,所以應使用雙引號。
實驗三:花括弧的效率
我們的實驗是1000次執行含有數量一定的變數標記的檔案,獲得解析過程中的速度。
時間單位 TT,表示約 1.581×10[sup]-7[/sup]s~1.666×10[sup]-7[/sup]s 。(TT 變化)
得到三組資料,表示 "{$abc}" 比 "$abc" 快。
15.3 TT,大概0.0000024186s
14.5 TT,大概0.0000024093s
15.3 TT,大概0.0000024152s
這資料是十分驚人的,平均結果 15 TT。
這意味著:使用花括弧的解析速度,大約是不使用花括弧的16倍。
結論:在雙引號中表示變數,儘可能使用花括弧。
實驗四:連續與非連續的效率
我們的實驗是1000次執行含有數量一定的變數標記的檔案,獲得解析過程中的速度。
時間單位 TT,表示約 1.581×10[sup]-7[/sup]s~1.666×10[sup]-7[/sup]s 。(TT 變化)
第一組實驗資料,表示 "{$abc}{$abc}{$abc}..." 比 $abc.$abc.$abc 平均每個變數解析快
22.45 TT,大概0.0000035498s
21.03 TT,大概0.0000035037s
22.12 TT,大概0.0000034930s
花括弧(連續)比單引號(非連續)快的時間,平均結果 22 TT。
這意味著:使用花括弧的解析速度,大約是使用不連續的單引號的23倍。
結論:在單引號中表示多個變數(或資料總量少),儘可能換用雙引用,並使用花括弧。
第二組實驗資料,表示 "...$abc$abc$abc..." 比 ‘...’.$abc.$abc.$abc.'...' 平均每個變數解析快
7.15 TT,大概0.0000011311s
6.57 TT,大概0.0000010943s
6.83 TT,大概0.0000010777s
雙引號(連續)比單引號(非連續)快的時間,平均結果 7 TT。(該資料變化)
這意味著:變數多時,使用雙引號(不使用花括弧)的解析速度,大約是使用不連續的單引號的8倍。
結論:在雙引號中表示多個變數(或資料總量少),比使用單引號而需要用「串連運算子」要快。
結論:表示多個變數時(或資料總量少),應可能範圍內使用雙引號,並使用花括弧。
(附:作者推測,這可能和記憶體空間的分配有關係,連續符可能會使記憶體不斷調整)
最終結論:
首先,表示簡單的資料時(不需要轉義),盡量用單引號。
'Cal: Are you good at long jump?'
但如果因為使用單引號,而需要進行轉義(即包含單引號),考慮使用雙引號。
'Cal: Yes. But, you know, it\'s written.' => "Cal: Yes. But, you know, it's written."
如果需要表示變數,應盡量使用花括弧。
"Cal: $to" => "Cal: {$to}, you shouldn't go shopping."
盡量使其連續:
'Cal: '.$calsaid => "Cal: $calsaid" => "Cal: {$calsaid}"