【PHP】コードをスッキリ書くための三項演算子とその可読性について

エディタPHP

こんにちは。いっとくです!

お仕事では主にFuel PHPを使ってWebサイトの開発をし、プライベートでは体が動かなくなるまでダンスしてます!

今回はPHPにおける三項演算子の使い方やその周辺情報についてまとめてみました!

三項演算子はコードを短く書くことができるのでスッキリしたコードが書ける反面、多用しすぎるとコードの可読性が悪くなってしまったり、たまにしか使わない書き方に遭遇したときにパッと見でよくわからない時があるのでしっかり把握して使いこなしましょう。というか自分への戒め。

スポンサーリンク

基本的な三項演算子の書き方

三項演算子って、、、また小難しいネーミングしとりますね!という感じ。

読んで字のごとく、項が三つある計算式のことで書き方は以下の通り。

<?php

$a ? $b : $c;

エンジニアにはおなじみの書き方ですが、プログラミング初心者の方が見たら書き間違えにしか見えないと思います。

そりゃそうですよね。今まで学校で習ってきた数学に”?”とか”:”なんて登場しませんから。むしろ?なんて書こうものなら先生に呼び出されかねないです。

これは、変数aがtrueだったら$bが評価され、falseだったら$cが評価されるという意味です。

もっと噛み砕いていうと最初の式が正しかったら”?”の後ろの処理をして、正しくなかったら”:”の後ろの処理をするということです。

三項演算子は抽象的な書き方を見るよりも、実際の例で見た方がわかりやすいと思うので以下を見てみましょう。

<?php 

$number = rand(1,2); // 変数numberに1か2がランダムで入る

echo ($number === 1) ? '1っす!' : '2っす!' ;

まず、変数numberにrand関数を使って、1か2がランダムで入るようにします。

そして$numberの中身が1だったら「1っす!」、2だったら「2っす!」がechoで出力されるようになっています。

実際の現場だと三項演算子で評価した結果を変数に代入する場面が多い気がします。

<?php

$number = rand(1,2);

$result = ($number === 1) ?  '1が出ました!' : '2が出ました!';
echo $result //1が出たらresultには「1が出ました!」が入り、2がでたら「2が出ました」が入る

上記のような感じですね。

ちなみに、($number === 1)のように条件式を()でくくっていますが、この()は書かなくても動きます。

え?じゃ()は書かない方がスッキリするんじゃないかって??

確かにコードを書く時余計な情報は少ない方がいいですが、これは余計な情報ではないと思います。

特に条件式が複雑になると、どこまでが条件式なのかがわかりづらくなるので、()で囲む癖をつけておくといいかと思います。

複雑な下記のような感じです。

<?php

$number = rand(1, 10);

$result = $number % 3 === 0  && $number % 2 === 0 ? '6が出ました!' : '6じゃない!';
$result = ($number % 3 === 0  && $number % 2 === 0) ? '6が出ました!' : '6じゃない!';

条件式が長いとどこまでが条件式なのかを判断するのに少し時間がかかりますよね。

そしてこの三項演算子は単純なif文をスッキリさせるのにとっても役立ちます。

まずはif文で条件に合わせて異なる変数を入力するという簡単な処理を書きます。

<?php

$number = rand(1, 10);

if ($number === 1) {
    $result = '1が出ました!マジでおめでとう!';
} else {
    $result = '1じゃない!でも諦めないで!';
}

echo $result;

はい。とても簡単です。

しかしこんな簡単なことをするのに5行使うってちょっと長い気がしますよね。

そこで三項演算子を使うとこう!

<?php

$number = rand(1, 10);

$result = ($number === 1) ? '1が出ました!マジでおめでとう!' : '1じゃない!でも諦めないで!';

echo $result;

OH! SUKKIRI!!

かなりスッキリしました。アメイジングです。

if文だと5行も必要とした条件によって異なる値を代入するという処理が1行で済みました。

こんな感じでコードをスッキリ書くことができるので便利な三項演算子なのですが、書き方によってはわかりづらくなってしまうため、しばしば悪者扱いをされます。

三項演算子の書き方には気をつけて!

三項演算子はよく炎上します。というか議論の的になります。

その理由はズバリ書き方によっては可読性の悪いコードが完成してまうから。

特に入れ子の条件式を三項演算子で書こうとすると、パッとみで全然意味がわからないイミフコードが出来上がります。

ということでイミフコードを書いてみましょう。

<?php

$number = rand(1, 10);

$result = ($number % 2 === 1) ? ($number === 3 ? '3です' : '3以外の奇数') : ($number === 2 ? '2です' : '2じゃない偶数');

まずは$numberが奇数か偶数かを判定した後、それぞれの処理でさらに三項演算子で分岐させています。

処理自体はすごく簡単な内容なのですが、?とか:とか()が次々と現れるせいで、何が起きているのかじっくり読まないと、なかなか把握できません。

これなら多少長くてもif文で書いた方が読みやすいはず。

<?php

$number = rand(1, 10);

if ($number % 2 === 1) {
    if ($number === 3) {
        $result = '3です';
    } else {
        $result = '3以外の奇数';
    }
} else {
    if ($number === 2) {
        $result = '2です';
    } else {
        $result = '2じゃない偶数';
    }

if文が入れ子になっているので、こちらも少しわかりづらいんですが三項演算子だけで書くよりはマシですね。

では最初の条件分岐だけif文で行い、次の条件分岐を三項演算子にして書き直してみましょう。

<?php

$number = rand(1, 10);

if ($number % 2 === 1) {
    $result = ($number === 3) ? '3です' : '3以外の奇数';
} else {
    $result = ($number === 2) ? '2です' : '2じゃない偶数';
}

Awesome!!

なんかすごく読みやすくなったし、何が起きているかも把握しやすい気がします。

こんな感じで三項演算子はif文とのバランスに気をつけて書けば、よりコードを読みやすく書くこともできるので、うまいこと使いこなしていきましょう!

ちなみに三項演算子はif文で書くよりも処理のスピードが遅くなりますが、数万回繰り返してようやく体感できるレベルなので、そこまで気にしなくてもいいとは思います。

ついでに三項演算子の親戚も紹介する

はい、というわけで最後に書き方や動きが三項演算子っぽいのにちょっと違うという親戚みたいな奴らを紹介したいと思います。

別に使いこなせなくても困りませんが、他人のソースコードを読む際に登場しないとも限らないので知っておいて損はないでしょう。

エルビス演算子 「?:」←これ

ひとつ目の親戚がエルビス演算子というやつ。

なんなんそれ?エルビスプレスリー?

ということでこれがエルビス演算子

<?php

$tastes = array(
    'bitter' => 'こりゃうまい',
    'sweet' => 'うまい',
    'sour' => '',
);

foreach ($tastes as $taste => $isFavorite) {
    $cooking[] = $isFavorite ?: $taste . 'はいらぬ';
}

var_dump($cooking); // [0] => こりゃうまい [1] => うまい [2] => sourはいらぬ

上記の例だと$isFavoriteの値があれば、$isFavoriteの中身を返し、もし$isFavoriteの中身が空なら、”?:”の後ろの内容を返しています。

つまり、三項演算子でいう条件判定の部分がtrueだったら条件式をそのまま返し、falseだった場合に”?:”の後ろの処理を返すというもの。まぁ特定の条件下で使える省略記法ですね。

変数に中身が入っているかどうかをチェックして、空じゃなければそのまま返して、空だった場合は別の条件を入れるというような変数のバリデーションみたいな処理をスッキリ書くのに使えそうですね。

Null合体演算子 「??」←これ

こんな記号メールとかLINEでしか使ったことねーよって感じですが、プログラミングの世界では「Null合体演算子」という謎の名前で使われています。なんかエロいですね。

ということでNull合体演算子の使い方です。

<?php

$a = null;
$b = 'Bです!';

echo $a ?? $b; // Bです!

こんな感じで??の左辺がnullだった時に、右辺を評価します。

ということは三項演算子っぽい見た目ですが、動きに関してはどちらかというと”>”とか”<“みたいな比較演算子のような感じですね。

ってことはこいつは全然三項演算子の親戚じゃない。

ちなみにこちらのNull合体演算子は空文字では評価されません。

<?php

$a = '';
$b = 'Bです!';

echo $a ?? $b; // $aが評価されるので何も表示されない

つまり変数の値がNullかどうかチェックして、Nullがくると困るから別の値を入れておきたいという時にしか使えないということですね。

以上、三項演算子とその周辺の情報についてまとめてみました!

三項演算子は可読性の悪化に繋がることもあるので、現場によっては完全に禁止しているところもあるという噂を聞いたりしますが、個人的には単純な条件分岐とかなら見やすくなることもあると思うので、バランスよく使えたら世の中が平和になると思ってます!

以上、いっとくでした。さようなら!

コメント

タイトルとURLをコピーしました