グローバルナビゲーションへ

本文へ

フッターへ

お役立ち情報Blog



いろいろな演算子を使ってPHPコードをスマートにしよう!

みなさん、if文はお好きでしょうか?
コードが太ってしまうので筆者はあまり好きではありません。
今回はそんなときに便利なPHPで使える演算子たちをいくつか紹介していこうと思います。

三項演算子(?:)

式の結果がtrueの場合は1つ目、falseの場合は2つ目の結果を返す演算子です。

例)
$a = '';
$b = '文字列文字列';
$resultA = empty($a) ? 'aは空です' : $a;
$resultB = empty($b) ? 'bは空です' : $b;

echo $resultA; // aは空です
echo $resultB; // 文字列文字列
 empty($a) はtrueになるので1つ目の結果「aは空です」を返します。
 empty($b) はfalseになるので2つ目の結果「文字列文字列」を返します。

上記の例は、下記のif文と同等になります。

$a = '';
$b = '文字列文字列';
if (empty($a)) {
    $resultA = 'aは空です';
} else {
    $resultA = $a;
}
if (empty($a)) {
    $resultB = 'bは空です';
} else {
    $resultB = $b;
}

echo $resultA;
echo $resultB;

if文で書くと5行になるコードが1行で書けるので、とてもスマートになります。

PHP マニュアル

エルビス演算子(?:)

式の結果がtrueの場合は左辺、falseの場合は右辺を返す演算子です。

例)
$a = '文字列文字列';
$resultA = $a ?: 'aは空です';

echo $resultA; // 文字列文字列
 $a はtrueになるので左辺(=$a自体)を返します。

エルビス演算子は三項演算子でも書き表すことができます。

上記の例と同等)
$a = '文字列文字列';
$resultA = $a ? $a : 'aは空です';

echo $resultA;

式の結果をそのまま使いたいときはエルビス演算子、式の結果で返す値を変えたいときは三項演算子と使い分けられます。

Null合体演算子(??)

式の結果がNullの場合は右辺、そうでない場合は左辺を返す演算子です。
※PHP7系から実装されました。

例)
$a = null;
$resultA = $a ?? 'aはNullです';

echo $resultA; // aはNullです
 $a がNullなので右辺を返します。

Null合体演算子は三項演算子、エルビス演算子でも書き表すことができます。

上記の例と同等)
$a = null;

// 三項演算子の場合
$resultA = is_null($a) ? $a : 'aはNullです';
echo $resultA;

// エルビス演算子の場合
$resultA = $a ?: 'aはNullです';
echo $resultA;

エルビス演算子と似ていますが、formのpost値等Nullableの値を式に使う場合はNull合体演算子を使うことで、エラー回避の is_null() を使う必要がなくなり、よりスマートです。

PHP マニュアル

宇宙船演算子

式の左辺のが大きければ1を、等しければ0を、右辺のが大きければ-1を返す演算子です。
※PHP7系から実装されました。

例)
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 'a' <=> 'b'; // -1
echo 'b' <=> 'a'; // 1

つまり上記の例の1つ目をif文で表すと、

上記の例と同等)
if (1 < 1) {
    return -1;
} elseif (1 > 1) {
    return 1;
} else {
    return 0;
}

以上、以下、等価で条件分岐をすることは少なくないので、if文やswitch文の条件式にも使えます。

PHP マニュアル

使いすぎには注意!!

まず下記のコードを見て下さい。

<?php

$a = 1;
$b = 10;
$c = 100;
$d = 'hoge';

$result = !is_string($a) ? !is_string($b) ? !is_string($c) ? !is_string($d) ? 'stringはありません' : 'dはstringです' : 'cはstringです' : 'bはstringです' : 'aはstringです';
echo $result. PHP_EOL;

1番はじめに文字列がアサインされた変数名を返す三項演算子です。
if文で書くと下記のようになります。

<?php

$a = 1;
$b = 10;
$c = 100;
$d = 'hoge';

if (is_string($a)) {
    $result = 'aはstringです';
} elseif (is_string($b)) {
    $result = 'bはstringです';
} elseif (is_string($c)) {
    $result = 'cはstringです';
} elseif (is_string($d)) {
    $result = 'dはstringです';
} else {
    $result = 'stringはありません';
}
echo $result. PHP_EOL;

三項演算子のほうがスマートではありますが、コードの保守性の観点で見るとif文のほうがロジックを理解しやすいと思います。
このように複数の演算子をネストしてしまうと、逆にコードの保守性が悪くなってしまう場合があるので用法用量を守って使うのが効果的です。

さいごに

PHPで使える演算子をいくつか紹介してきました。
自分で書いたコードでも3ヶ月も経つと忘れてしまいがちですが、コードをスマートにすることで改修やリバースエンジニアリングのコストを減らすことが可能です。
当記事が、3ヶ月後の自分にお叱りを頂いている方(筆者もですが…)や、これからPHPを始めるという初心者の方のお力になれたら幸いです。

この記事を書いた人

ばね
ばねソリューション事業部 システムエンジニア
東京で2年半エンジニアとしての経験を積み、浜松にUターンの後、アーティスへ入社。
ソリューション事業部のWebエンジニアとして、システムの設計・開発・保守・運用からインフラまで幅広く従事している。
フルスタックエンジニア目指して現在も勉強の日々。車が好き。
この記事のカテゴリ

FOLLOW US

最新の情報をお届けします