PHPを使用する場合の(null!= $ object)と($ object!= null)の(ある場合)違いは何ですか?


8

私はJavaに慣れているので、条件は左から右に解釈されると常に考えています。つまりnull != $obj$obj != null

これは、PHPには当てはまらないようです。

常にnull左側から始めると、PHPで何か問題がありますか?Javaからの動作を維持できますか、それともPHPの条件を処理するときに何か他のことをするようにトレーニングする必要がありますか?


5
違いはありませんが、yodaの条件は避けてください。Javaの標準であるとか、解釈に問題があるとおかしいのです。
yannis 2012

しかし、それは常にnullで始まることの議論になるでしょうか?原因null = $ aは、$ a = nullが検出されずに通過する場所でPHPを制限します。
Wizard Of Tech

null = $a割り当てでnull != $aあり、比較です、という意味null == $aですか?null = $a動作しません。また、割り当ての順序での解釈は重要であり、Javaでも動作しません。私たちは条件文を言っているのですか、それとも割り当てですか?
yannis 2012

lol ... aehm ... ok。申し訳ありませんでしたが、自分で十分に明確にできていませんでした。条件の記述を間違えて、ヨーダ式を作成したとします。(あなたが言ったように)そして、次のようなコード行を生成します:($ a = null)。それはあなたが法的条件を作り出した気付かれない原因を通過します。左手側で常にnullで条件を開始するようにチームに指示すると(nullチェックが使用されている場合)、この種のミスを回避するのに役立ちます。実際...私はあなたのフィードバックのおかげで私自身の質問に答えました。:-)
Wizard Of Tech

1
Javaとどのように違うのですか?
phant0m 2012

回答:


4
  • (技術的な)違いはありません。私の知る限り、Javaにも違いはありません。
  • PHPでは、これらのいずれも使用しないでください。

常に厳密な比較演算子===を使用し、!==可能であれば使用することをお勧めします。緩やかな比較演算子が実際に必要になるタイミングがわかります。

誤解

私はあなたがいくつかのことについて混乱するかもしれないと信じています:

  • 短絡演算子
  • 評価の順序
  • 演算子の優先順位

PHPマニュアルに、「PHPは各条件を左から右に順番にチェックする」と書かれていることがわかりました。

番号、

  • PHPのマニュアルにそうは書かれていませ。コメントです。
  • PHPはそれを行いませ

PHPは条件を左から右に評価しますが、結果が判明すると停止します。

expr1 && expr2

場合はexpr1評価するが、にfalseexpr2なりません評価されます。これは短絡と呼ばれ、十分に文書化されているようには見えません。例1のコメントを除いて、この問題に関する他の公式のメモは見つかりませんでした。ただし、これはよく知られている機能です。

誤謬

私はJavaに慣れているので、条件は左から右に解釈されると常に考えています。つまり、null!= $ objと$ obj!= nullには決定的な違いがあります。


PHPは各条件を左から右に
エルゴから順にチェックします。同じ「ベストプラクティス」を適用できます。

エルゴ:何もない –不平等。結論は前提から続いていません。を使用しているconstant == $variableか、または短絡評価の順序、または演算子の優先順位の$variable == constantいずれにも接続されていません。

未定義の動作

の両方のオペランド!=常に評価されます。PHPの場合、評価順序(ここでは関係ありません)は実際には指定されていません(ドキュメントに記載されていない場合など)。


トピックの明確化のためのThx。私のJavaナレッジに関しては、あなたの口調は好きではありませんが。(Java言語仕様のセクション15.7を参照)まとめてみましょう。PHPでは評価の順序が指定されていないため、信頼できません。2番目は!=または== user ===または!==を使用しないでください。
Wizard Of Tech

@anann Javaの知識をどこで「評価」していると思いますか。私が言った唯一のことは"nor is there in Java to my knowledge."、セクション15.7を読みましたが、ここでは重要ではありません。(例のように)比較に副作用がない限り、評価の順序は重要ではありません。どの部分が気分を害していると思いますか?
phant0m 2012

0

あなたの特定のケースに関して、別のアプローチは、組み込みのphp関数is_nullを使用することです。つまり、is_null($ mixedValue)で終わることになり、すべての作業が行われ、型の比較とその他すべてが適切に行われます。


-1

@ phant0m:OKポイントが取られました... PHPでコーディングするときは、絶対に!=または==を使用しないでください!===および===を使用してください。したがって、この質問は最初は間違っていました。PHPに関しては、条件の両側にNULLを使用するベストプラクティスはありません。


5
それはトレードオフです。安全性のために読みやすさを犠牲にします($a == NULL意図をエンコードしNULL == $a、安全対策を追加します)。この安全性は、加熱できない自動チェックではなく手動作業(習慣)に依存しているため、それほど強力ではありません。私はトレードオフにそれだけの価値があるとは思いませんが、それは個人的な意見の問題です。
tdammers 2012

1
ああ、私はいつも「ヨーダ条件」を想定し(「二十から三リンゴは、あなたが持っている場合は、」彼らが読んだから、あなたの条件にサブジェクトとオブジェクトを反転させると呼ば23 == num_apples(「あなたは二十から三リンゴを持っている場合」)ではなくnum_apples == 23) 。
tdammers

2
「ヨーダ文」が何であるか混乱しているようです。左側にNULL(または式の定数部分)を置くと「ヨーダ」になります:gordienoye.ca/2012/02/07/when-yoda-writes-if-statements
Martin York

2
また、PHPは、あなたがこれを行う場合は警告を表示します:stackoverflow.com/q/718415/14065はあなたがwarnignsとエラーについて、エラーログをチェックし、それらのすべてを修正する必要があります。ヨーダスタイルは90年代の流行でした。主張は、それがこの問題のグループを解決したということでした。実際には、コードが読みにくくなり、ほとんどの言語のコンパイラー(インタープリター)がすでに問題について警告しています。したがって、それらを使用することには実際の利点はありません(コードが警告なしで実行されることを確認すると仮定します(とにかくこれを行う必要があります))。より良い解決策は、条件付きで代入を行わないことです(したがって警告なしで実行されます)。
マーティンヨーク

@tdammers読みやすさは意見なので、問題のない私たちにとっては、「yoda-conditionals」がデフォルトの傾向にあります。私の目は最初に条件に引き付けられるので、秩序は助けにも害にもなりません。>and についても<、「その方が大きい場合」のように読み、次に、条件式が通過するために大きい方を読み、次に反対側を読みます。
12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.