ホームページ >バックエンド開発 >PHPチュートリアル >arrays における数値以外のキー名の引用符を解析する必要性_PHP チュートリアル

arrays における数値以外のキー名の引用符を解析する必要性_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 14:59:37932ブラウズ

配列を操作するときに、配列内の数値以外のキー名に引用符を使用しない人がたくさんいるのを見てきました

コードをコピーします コードは次のとおりです:

$array[key] = $value ;

このようなコードは「きちんとしていて」正常に実行できると考える人もいるかもしれませんが、それは理解できます。

コードをコピーしてください。コードは次のとおりです: error_reporting = ~E_NOTIC

彼は常に自分の「きちんとした」スタイルに没頭している可能性があり、NOTICE プロンプトも表示されず、これを実行することでどれだけパフォーマンスが低下するか理解していません~
ここで、見てみましょう:
good.php:



コードをコピーします
コードは次のとおりです: $array = array();
$i = 0;
while (++$i & lt; 1000) {
$ array ['good'] = 2;
? & gt;



コードをコピーします。
コードは次のとおりです。

& lt;? Php
$ array $ array = array();
$i = 0; while(++$i < 1000){ $array[good] = 2; }?>

実行時間を個別に確認します(複数の平均時間):

引用符付き:




コードをコピー

コードは次のとおりです:

$ time php -f Good.php
real 0m0。 013S
USER0M0.005SSYS0M0.007
引用符なし:




コードのコピーcodeコードは次のとおりです。未定義の定数 bad の使用 - /home/huixinchen/tmp/ bad.php
on line で 'bad' とみなします (ここでは 999 行目が省略されていることに注意してください)
real 0m0.100s
user 0m0.020ssys 0m0.029
ほら、違いはどのくらいですか?ああ、おそらくそれらをシミュレートする必要があります。「幸運な」人のために、記録に費やされるオーバーヘッドを差し引いて注意してください、~

コードをコピーしてください

コードは次のとおりです:


$ time php -f bad.php
real 0m0.037s
user 0m0. 018s
sys 0m0.018
基本的に、引用符を使用する場合と使用しない場合の効率の損失は、 3 回
それでは、これらの効率損失はどこに行くのでしょうか? 2 つのファイルによって生成された OPCODE シーケンスを個別に見てみましょう:good.php:



コードをコピーします

コードは次のとおりです。以下:


ファイル名: /home/huixinchen/tmp/good.phpコンパイル済み変数: !0 = $ array, !1 = $i
line # op fetch ext return オペランド
-------- ------------------------ ------------------------ -----------------------
2 0 INIT_ARRAY ~ 0 1 ASSIGN !0, ~0
3 2 ASSIGN !1, 0
4 3 PRE_INC $3 !1
4 IS_SMALLER ~4 $3, 1000 5 JMPZ ~4, ->9 5 6 ZEND_ASSIGN_DIM !0, '良い' 7 ZEND_OP_DATA 2, $6 6 8 JMP ->3
8 9 RETURN 1
10* ZEND_HANDLE_EXCEPTIO



bad.php :




コードをコピーします

コードは次のとおりです:

ファイル名: /home/huixinchen/tmp/bad.php
コンパイル済み変数: !0 = $array, !1 = $i
line # op fetch ext return オペランド
--------------- -------------------------------------------------- ------------------
2 0 INIT_ARRAY ~0
1 ASSIGN !0, ~0
3 2 ASSIGN !1, 0
4 3 PRE_INC $3 !1
4 IS_SMALLER ~ 4 $3, 1000
5 JMPZ ~4, ->10
5 6 FETCH_CONSTANT ~5 '悪い'
7 ZEND_ASSIGN_DIM !0, ~5
8 ZEND_OP_DATA 2, $7
6 9 JMP ->3
8 10 RETURN 1
11* ZEND_HANDLE_EXCEPTIO

PHP が引用符なしのキー名を取得する定数として扱い、見つからない場合は NOTICE をスローすることがわかります (実際、 NOTICE プロンプトからもわかります)。次に、「定数名」に基づいて文字列を生成し、この文字列をキー名として使用して続行します~
賢明な方であれば、次のような予期しないエラーが発生する可能性があると間違いなく考えるでしょう:
コードをコピーする コードは次のとおりです:

define('key_name' , 'laruence');
....
//多くのコード行を省略します
$array[key_name] = 2; //$array になります。 ['laruence'] = 2;
//そんなエラー、とても落ち込んでしまいますよね

配列内の数値以外のキー名には引用符が必要です〜
ああ、私は文字列変数を置き換えるときに引用符を書くとエラーが発生します
まあ、標準的な書き方:
コードをコピーします コードは次のとおりです:

$string = "変数の値は {$array['key']} "

「怠け者であること」には非常に同意しますが、怠惰には原則も必要です。
最後に、error_reporting をオフにすることで良いコードを偽装するべきではありません。
FETCH_CONSTANT OPCODE ロジックには定数に関連するものがないことに注意してください:
コードをコピー コードは次のとおりです:

....
if (!zend_get_constant(opline->op2.u.constant) .value.str.val,
opline->op2.u.constant.value.str.len, &EX_T(opline->result.u.var).tmp_var TSRMLS_CC)) {
zend_error(E_NOTICE, "未定義の定数 %s - '%s' と仮定します",
->op2.u.constant.value.str.val,
->op2 .u.constant;//「定数」の名前を取得しますstring
zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);//スペースを割り当て、文字列を生成します
}
.. ..

http://www.bkjia.com/PHPjc/328122.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/328122.html技術記事配列を操作するときに、配列内の数値以外のキー名に引用符を使用しないでください。 $array[key] = $value; と考える人もいるのは理解できます。 .
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。