2つの引数のみでPHPの三項演算子を使用する


9

私は最近、いくつかのコードをレビューしていましたが、ぼんやりとした感覚で、次のような構造を残していることに気付きました。

$guid = empty($subscription->guid) ?  : $subscription->guid;

さて、これはそれがはずのものをやっていなかったとされ、間違ったが、そのプロパティは常に設定されましたので、それは罰金を働いていた、と理由の5.3以来、何の構文エラーがない、次の変更は

PHP 5.3以降、三項演算子の中間部分を省略することが可能です。式expr1?:expr1がTRUEと評価された場合、expr3はexpr1を返し、そうでない場合はexpr3を返します。

私はこの変更を認識していませんでしたが、今、それを使用する必要があるかどうかに興味があります。これは私が痛んで、あなたが例えばを行うことができますルビーのような言語から欠落していたものですa = b || cいずれかを取得するbcではなく、「本当の」ブール。ただし、3項演算子に選択した構文は、私には少し直観に反しているようです。これを製品コードで使用する必要がありますか?偶然見た時は間違いなく自分を投げました。


回答:


7

第二引数なし三条件演算子は、ビット新規であり、それは似ている1ヌル合体のような他のアルゴル誘導体言語で見出さ演算子C#とPerl、あなたが言及したように、||ルビー(およびJavaScript)オペレータ。

最初は奇妙に見えますが、あまりにも外見がよく(特に他の言語で同様の演算子の前例があるため)、キーストロークを大幅に節約できます。また、名前空間区切り文字(\)で発生したことが何らかの兆候である場合、奇妙な構文が最終的にPHPコミュニティーに採用されます。

しかし、PHPアプリケーションが直面しがちな主な問題の1つは、新しいバージョンのPHPがリリースされてからホストがサポートを開始するまでの間に(ときどき)非常に長い遅延時間です。これは、古いバージョンのPHPとの下位互換性が必要になるという問題につながり、このような便利な変更の使用を忘れます。

それがあなたにとって問題ではなく、あなたのチームがその使用に同意している場合(またはあなたがソロ開発者である場合は、それに慣れている場合)、ぜひそれを試してください。名前空間の区切り文字と同様に、将来のすべてのPHPプロジェクトで受け入れられるようになるかどうかは問題ではないかと思います。


注1:ただし、同一ではないため、null融合演算子は非null値(PHPのような真の値で?:はない)でのみテストされ、コメントで述べたように、構文は未定義の通知を抑制しません。


現時点では、私の「チーム」は純粋に私で構成されています。私たちは通常、構築するサイトの98%をホストしており、5.3.6の上でホストしているため、ホスティングは問題ではありません。機能自体はそれほど珍しいものではなく、質問の根源となったその構文だけであることがわかりました。(@未定義のものに関する通知を非表示にするための)より多くの構文がないと、null結合演算子のように動作しないという問題もあります。
マシューシャーリー

3
@MatthewScharley名前空間の区切り文字(\)の失敗が何らかの兆候である場合、奇妙な構文は、PHPで広く採用されることの障害にはなりません。実際には、いつ使用するかではなく、いつ使用するかによって決まります。

3

私には、それはコードのエラーのように見えます。それは間違っているように見え、一般的には、いくつかのキーストロークを保存するためにエラーが発生したように見える構文の使用は避けます。あなた(または他の誰か)が後でコードを読み返すと、その行がつまずいて、何をしているのかを解析することに時間を費やす必要があると思います。


与えられた例は間違っています。意図したとおりに機能を正しく使用すると、$foo = @$bar ?: 'baz'と同等になり$foo = (@$bar ? $bar : 'baz')ます。私はあなたのコメントにも同意します。
マシューシャーリー

1

まあ、PHPは、boolean型とがある||ので、PHPでの結果は、オペレータが戻るboolenを$a || $bブール値で、これはと一致している&&と同じように&&、それはどちらか一方を返すことはほとんど意味がありますが、復帰に理にかなってtrue/ false。すべてのブール演算子がブール値を返すことも非常に論理的に聞こえます。

さらに、これはPHPからの発明ではなく、Cに続くもので、「クラシック」PHPの多くの設計要素が由来しています。C99標準の§6.5.14からの引用:

|| いずれかのオペランドが0と等しくない場合、演算子は1を返します。それ以外の場合は0になります。結果の型はintです。

そして、まあ、あなたが使うべきかどうか?:一般的な形では答えられないかもしれませんが、心に留めてください:言語への最良の方法は、それが提供する構造とそれが提案するパラダイムを使うことです。CコードのようなJavaコードを書くのはほとんど意味がありません;-)


0

これは非常に便利な演算子であり、言語標準で明示的に定義されているため、必ず使用する必要があります。

これは公式にはGrooy のElvisオペレーターと呼ばれ(なぜ?よく見てください!)、Java 7での導入が提案されていました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.