user 0m0. 018s
-------- ------------------------ ------------------------ -----------------------
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.comtruehttp://www.bkjia.com/PHPjc/328122.html技術記事配列を操作するときに、配列内の数値以外のキー名に引用符を使用しないでください。 $array[key] = $value; と考える人もいるのは理解できます。 .