PHPの一重引用符と二重引用符の文字列効率

2534 ワード

簡単な答えは、明らかに無力だ.今日は実験をして、単一引用符と二重引用符の違いを見てみましょう.誰が速いのか、誰が遅いのか. 
テストコードは次のとおりです.
<?php 
$single_quotes = 'This is a String'; 
$double_quotes = "This is a String"; 
echo $single_quotes; 
echo $double_quotes; 
$var = 'String'; 
$single_quotes_var = 'This is a '.$var; 
$double_quotes_var = "This is a $var"; 
echo $single_quotes_var; 
echo $double_quotes_var; 
$var = 'This'; 
$single_quotes_var_pre = $var . ' is a String'; 
$double_quotes_var_pre = "$var is a String"; 
echo $single_quotes_var_pre; 
echo $double_quotes_var_pre; 
?> 

次に、以前に述べたOpcodesジェネレータについて、最終的にこのコードがどのように実行されるかを見てみましょう.
Branch analysis from position: 0 
Return found 
filename: /home/xinchen/string.php 
function name: (null) 
number of ops: 24 
compiled vars: !0 = $single_quotes, !1 = $double_quotes, !2 = $var, !3 = $single_quotes_var, !4 = $double_quotes_var, !5 = $single_quotes_var_pre, !6 = $double_quotes_var_pre 
line # op fetch ext return operands 
------------------------------------------------------------------------------- 
2 0 ASSIGN !0, 'This+is+a+String' 
3 1 ASSIGN !1, 'This+is+a+String' 
4 2 ECHO !0 
5 3 ECHO !1 
7 4 ASSIGN !2, 'String' 
8 5 CONCAT ~3 'This+is+a+', !2 
6 ASSIGN !3, ~3 
9 7 INIT_STRING ~5 
8 ADD_STRING ~5 ~5, 'This+is+a+' 
9 ADD_VAR ~5 ~5, !2 
10 ASSIGN !4, ~5 
11 11 ECHO !3 
12 12 ECHO !4 
14 13 ASSIGN !2, 'This' 
16 14 CONCAT ~8 !2, '+is+a+String' 
15 ASSIGN !5, ~8 
17 16 INIT_STRING ~10 
17 ADD_VAR ~10 ~10, !2 
18 ADD_STRING ~10 ~10, '+is+a+String' 
19 ASSIGN !6, ~10 
19 20 ECHO !5 
20 21 ECHO !6 
22 22 RETURN 1 
23* ZEND_HANDLE_EXCEPTION

なお、0~3番目のopラインでは、変数置換を使用しない場合、二重引用符と単引用符で生成されるOpcodesは同じであることがわかります. 
さらに、第4~第12条では、変数で置換する場合、二重引用符と一重引用符で生成されるOpcodesが異なることがわかります.二重引用符の場合のOpcodesを分析します.
7 INIT_STRINGは文字列変数を初期化し、~5の一時変数に格納します. 
8 ADD_STRINGは第1部の文字列を書き込みます. 
9 ADD_VARは、変数に置き換えられた文字列を書き込みます. 
第16-28行同理. 
ここから,二重引用符を用いた場合と単一引用符を用いた場合では,同じ論理で経験した実行は確かに異なることが分かった(なぜなら,OpcodesはPHPにとって最終的な実行コードであるからである).生成されたOpcodsの数だけでも、単一引用符を使用すると速いことを証明するのに十分です. 
コンパイルフェーズでは、二重引用符と単一引用符の違いも大きいので、scanningフェーズでは、二重引用符の文法規則は14個ありますが、単一引用符では6個しかありません. 
ほほほ、このような分析を経て、あなたはもっとはっきりと后でどのように単引用符と二重引用符を使うべきかを理解することができますか? 
ちなみに、変数置換を必要としない純粋な文字列については、C/C++では二重引用符が文字列を表すので、この場合は二重引用符を使うほうがよいことはよく知られています. 
またW 3 C規格では、HTMLの属性値は二重引用符で含まれるはずなので、一重引用符に慣れずに悪用しましょう