1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

(ジェフユナイテッドで覚える)三項演算子の世界へようこそ

Last updated at Posted at 2020-08-11

はじめに

三項演算子、使ってますか?
先日とうとう後輩の @miriwo 氏がめでたく三項演算子に目覚めたということで、これはめでたいということで筆を執りました。

PHP 「?:」 の正体を知ってすっきりした話

まあ、タイトルだけ見るとエルビス演算子に目覚めたのかなって気になってましたけど。
それはそれで大変便利なのです。

三項演算子とは

例を見てみましょう。

image.png
転載元: https://chiicomi.com/smp/r_news_detail?id=19e92c3c-0b86-11e6-8bd0-a0369f7b8e6e

こちらは我らがジェフユナイテッド市原千葉のマスコット、ジェフィとユニティです。
(千葉なのに)秋田犬の双子のわんこなんですが、キャラクターデザイン上の取り計らいで、大きさと背番号以外は区別がつかないようになっています。
ある程度のレベルのジェフサポになると 「キリッとしてるほうがジェフィ、やんちゃな方がユニティ」 とか 「耳がシャキッとしてるほうがジェフィ、丸っこい耳がユニティ」 とか言い出したりするんですが、他サポからは 「ジェフサポは(いろいろな意味で)あたまがおかしい」 と思われているので聞き入れてもらえません。

なので、犬の背番号が2だったらジェフィ、2じゃなかったユニティを name に代入するコードをJavaScriptで書いてみました。

const name = (dog.uniform_number === 2) ? 'Jefy' : 'Unity';

? の左に判定条件、その右に判定が true のときの値、 : を挟んでその右が false のときの値です。
これをたまにいる三項演算子否定派が書くとこんな感じになります。

const name = '';

if(dog.uniform_number === 2){
    name = 'Jefy';
} else {
    name = 'Unity';
}

長い……

要はこういうのをif文ではなく式で簡便に表現できるというのが三項演算子です。
実は本名は「条件演算子」といいます。

三項演算子は結構どの言語にも実装されています。

入れ子の三項演算子

あんまりやってはいけないのですが、三項演算子はネスト(入れ子)して書くことができます。

例を見てみましょう。

image.png

実はジェフのマスコットはジェフィとユニティのオス犬の双子だけではなく、どこからともなく現れた みなちゃん という白い雑種のメス犬もいます。写真の一番右の子ですね。
ちなみにジェフィとユニティは毎年シーズンシートを買って入っている一般サポーターらしいのですが、みなちゃんはれっきとしたジェフユナイテッド株式会社の社員です。

そんな設定の話は置いといて、みなちゃんの背番号はサポーターナンバーと呼ばれる12番です。つまりこんな感じになります。

const name = (dog.uniform_number === 2) ? 'Jefy' : (dog.uniform_number === 9) ? 'Unity' : 'Mina-chang';

どうですか? 見づらくてハゲそうですよね。
見やすくするテクニックとして、記号の前で改行するというのがあります。
外人が書くコードでよく見かけますよね。

const name = (dog.uniform_number === 2) 
    ? 'Jefy'
    : (dog.uniform_number === 9)
        ? 'Unity'
        : 'Mina-chang';

ただ、この入れ子の三項演算子、**PHPだけなぜか動作が違います。**あいつはなぜか 右から評価 するので、カッコを使って、こんな感じに書かないと思ったとおりになりません。

$name = (dog.uniform_number === 2) 
    ? 'Jefy'
    : ( (dog.uniform_number === 9)
        ? 'Unity'
        : 'Mina-chang');

不毛感がすごい……

※追記
@rana_kualu さんからコメントでいただきましたが、カッコを使わない三項演算子のネストはPHP7.4からは非推奨、PHP8からはエラーになるとのことです。
参考: 【PHP8.0】PHPの三項演算子が他言語の実装に一歩近付く

おわりに

三項演算子の特殊な書き方として、エルビス演算子とかnull合体演算子の話は次回書きます。
それではお元気で! Enjoy, Summer!!

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?