このコード:
if (!isset($foo['bar']) || $foo['bar'] != 42) {
}
ショートサーキットのため、ロジックは実際には警告を発行しません。これは、最初の真の条件でスキップするためです。この場合、 が$foo['bar']
定義されていない場合に発生します。
これは、コンパイラがコード用に生成するオペコードからも確認できます。
compiled vars: !0 = $foo
line # * op fetch ext return operands
------------------------------------------------------------------------------
3 0 > ZEND_ISSET_ISEMPTY_DIM_OBJ 1 ~0 !0, 'bar'
1 BOOL_NOT ~1 ~0
2 > JMPNZ_EX ~1 ~1, ->6
3 > FETCH_DIM_R $2 !0, 'bar'
4 IS_NOT_EQUAL ~3 $2, 42
5 BOOL ~1 ~3
6 > > JMPZ ~1, ->8
4 7 > > JMP ->8
8 > > RETURN 1
以下のオペコードは重要です。
2 > JMPNZ_EX ~1 ~1, ->6
の反転された結果isset($foo['bar'])
がチェックされ、真の場合、コードは の値を実際に検査する次のいくつかのステートメントを飛び越えて、$foo['bar']
通知を回避します。
||
これはまた、2 つのオペランドを逆にすると、通知が表示され、2 番目のオペランドはとにかくほとんど役に立たないことも意味します。
0
、false
、などの値[]
も等しくないため、次のように42
使用することもできますempty()
。
if (empty($foo['bar']) || $foo['bar'] != 42) {
}
これにより、コードが読みやすくなることはほぼ間違いありません。