の結果:PHP演算子の優先順位のバグ?
var_dump(null != $a = 15);
var_dump($a);
は次のとおりです。
bool(true)
int(15)
このスクリプトはエラーをトリガされていないのはなぜ? !=
(等しくない演算子)は=
(代入演算子)より高い優先順位を持ちますので、$a
を最初にnull
と比較する必要がありますか?私は見つけることができます
の結果:PHP演算子の優先順位のバグ?
var_dump(null != $a = 15);
var_dump($a);
は次のとおりです。
bool(true)
int(15)
このスクリプトはエラーをトリガされていないのはなぜ? !=
(等しくない演算子)は=
(代入演算子)より高い優先順位を持ちますので、$a
を最初にnull
と比較する必要がありますか?私は見つけることができます
唯一の理由は、ドキュメントが、これはまだ合法であると言うことです:http://php.net/manual/en/language.operators.precedence.php#example-129
上記の表に示されているものには例外のようです。
この小さなメモに素敵なキャッチ! –
私はもう1つ注意しなければならないことは、以下のような読みやすさに関するコメントです: "厳密には必要でない場合でも、暗黙の演算子の優先順位と結合性に頼るのではなく、グループを明示的にすることによって、 –
「意図的な例外」ではありません。これを明示的に「許可」する追加レクサールールはありません。それは正常に動作するだけの方法です。このマニュアルの例は、不思議な開発者のためのものです。 – VolkerK
これは演算子の優先順位についてではなく、about:演算子優先順位リストは詳細を教えてくれません(実際には決してありません)。バイソンのルールと結果のパターンマッチングとスタックの削減について。
簡潔にするために、文をvar_dumpなしで使用しましょう。
これはパーサーがこのステートメントを "見て"いる方法です - または:がというステートメントです。
(私は、これはどこでも修正幅フォントでレンダリングすることを願っています...)
null != $a = 15 ;
T_VARIABLE
identifier compound_variable T_LNUMBER
namespace_name reference_variable common_scalar
general_constant base_variable scalar
scalar base_variable_with_functions_calls expr_without_variable
expr_without_variable variable = expr
expr T_IS_NOT_EQUAL \______ expr_without_variable _________/
\__________________ expr ____________________________________________/ ;
\_________________ unticked_statement _______________________________________________/
statement
(あなたがhttps://github.com/php/php-src/blob/PHP-5.6.15/Zend/zend_language_parser.yでルールを調べることができます)
の代入演算子のための特別なルールはありませんこの場合;パーサが文に一致する別の方法はないので、優先順位は適用されません。
間違いなく奇妙です。 '$ a == null = 15'は誤ったダンプも与えます。 '(null!= $ a)= 15'を入れると、予期しない' = 'エラーが吐き出されます。 –
'null!=($ a = 15)'と解釈するにはどうすればいいですか? '(null!= $ a)= 15'を指定すると、値15をブール値に代入しようとします。それは動作しません。 – VolkerK
@ VolkerKこれは一例ですが、このスクリプトには実生活の目的はありません!私の考えは、この種の表現から始まり、たくさんの 'if(!$ a = foo())'を見る(使用する)。 –