プロぽこ

PHP7 の新しい演算子をわかりやすく解説!宇宙船、null合体を使いこなそう

PHP7はおよそ10年越しとなるPHPのメジャーアップデートとしてリリースされました。

速度的な面も大幅に改善されましたが、それ以外にもPHP7で追加または更新された新たな演算子があります。

今回はそれらの演算子についてサンプルプログラムを示しながら解説していきたいと思います。

対象者としてはPHP初心者を想定していますが、ぜひPHPは使ったことあるけどPHP7についてはあまり知らないという方にも読んでいただければと思います。

1. 新しく追加された便利な演算子

PHP7からは便利な演算子が2つ追加されました。

「??(null合体)」演算子「(宇宙船)」演算子です。

ぽんぽこ

知ってるとホントに便利です!

1.1 「」演算子

「」演算子は宇宙船演算子と呼ばれるものです。

これは簡単で、左の値と右の値を比較して左辺が大きい場合は「1」、同じ場合は「0」、右辺が大きい場合は「-1」を返す演算子です。

何を言っているのかよくわからない場合はとりあえず下記のコードを実行すればパッとわかりますよ。

echo 10  3; // 1 が出力される
echo 1  10; // -1 が出力される
echo 5  5;  // 0 が出力される

これが何に使えるのか?と言うと、値をソートする関数の中で使えます。今までusort等でソートする場合は下記のように書く必要がありました。

$array = [4,6,2,3,1];
usort($array, function($a, $b) {
  if ($a == $b) {
    return 0;
  }
   return ($a 

これがPHP7からは下記のように書き換えることができます。

$array = [4,6,2,3,1];
usort($array, function($a, $b) {
   return $a  $b;
});

echo json_encode($array); // [1,2,3,4,6]

とても簡潔ですね!

また、この演算子は整数型限定というわけではありません。下記は浮動小数点数の並び替えに宇宙船演算子を使ったプログラムです。

$array = [4.8,3.3,2.5,3.2,0.3];
usort($array, function($a, $b) {
   return $a  $b;
});

echo json_encode($array); // [0.3,2.5,3.2,3.3,4.8]

さらには文字列に用いることもできます。順不同なアルファベットの文字をアルファベット順に直してくれます。

(もちろんできるとは言えわかりやすいとは言い難いのでstrcmp等を使った比較をすべきです。ただできるということだけ示しておきます。)

$array = ['b','a','e','d','c'];
usort($array, function($a, $b) {
   return $a  $b;
});

echo json_encode($array); // ["a","b","c","d","e"]

次の例は少し複雑ですが、なかなか凝った挙動をしてくれます。同じ要素数の配列であれば、配列のまま比較してくれます。

配列内の要素数のチェックが最初に走るので、要素数が違うと思ったような挙動にならないことに注意です。(場合によってはそれも利用できますが。)

要素数が同じ配列同士の比較の場合、最初の要素同士を比較します。それが同じだったら次の要素を比較し、同じならまた次を......というように比較してくれます。

下記の例では第1要素のアルファベットで昇順にソートし、もし同じ文字なら第2要素の数値で昇順にソートするという動作をします。

$array = [
  ['b', 10],
  ['a', 20],
  ['e', 5],
  ['d', 100],
  ['c', 1],
  ['a', 5000],
  ['b', 2]
];
usort($array, function($a, $b) {
   return $a  $b;
});

echo json_encode($array);

1.2 「??」演算子

「??」演算子はnull合体演算子と呼ばれるものです。この演算子は左の値がnullなら右の値が返るというものです。

下記のような感じで使えます。デフォルト引数をnullとして、何か引数が渡されたらそれを出力し、渡されなければ'hello'を出力するという関数です。

関数内の1行目にnull合体演算子があります。詳細に動作を説明すると「右の値がnullかどうかをチェック」し「nullでなければその値」を返し、「nullならば右の値」を返します。

function hello($str = null) {
  $res = $str ?? 'hello';
  echo $res.PHP_EOL;
}

hello(); // hello と出力される
hello('test'); // test と出力される

null合体演算子に似ている演算子としては三項演算子があります。上記と同じ出力をする関数を三項演算子を使って書くこともできます。

三項演算子は「?」の左の値の評価が「true」なら「:」の左の値を返し、「false」なら「:」の右の値を返す演算を定義するものです。

function hello($str = null) {
  $res = $str ? $str : 'hello';
  echo $res.PHP_EOL;
}

hello(); // hello と出力される
hello('test'); // test と出力される

この「null合体演算子」と「三項演算子」はどちらもほぼ同じように書くことができ、同じ結果を得ることができます。

この2つの演算子の違いは「?(??) の前の変数の存在判定をするかしないか」と言えます。

何を言っているかよくわからない方もいるかと思うので下記に例を出してみます。下記の例では評価する変数として「宣言されていない変数」を指定しています。

通常宣言されていない変数を参照しようとした場合(issetやemptyなどの判定関数を除いて)、エラーとなってしまいます。

そのため、三項演算子を利用した方法では「そんな変数はない!」というエラーになります。

しかしnull合体演算子を使った例では「存在しないこともfalseに含める」という判定をするので、エラーにならず動作してくれます。

// 三項演算子を使用
function exists_1() {
  //$hoge = ''
  $res = $hoge ? $hoge : 'hello'; // $hogeは存在しないので、エラーとなる
  echo $res.PHP_EOL;
}

// null合体演算子を使用
function exists_2() {
  //$hoge = ''
  $res = $hoge ?? 'hello'; // $hogeは存在しないので、「??」の右の値が返る
  echo $res.PHP_EOL;
}

exists_1(); // エラーとなる。Undefined variable: hoge
exists_2(); // hello と出力される

PHP7 より以前のPHPを使っている場合、null合体演算子でやっているようなことを下記のような三項演算子を使って表現していました。

issetで変数が存在するかを判定するという方法です。PHP7にすることでこれをより簡潔に書けるようになったということです。

function exists() {
  //$hoge = ''
  $res = isset($hoge) ? $hoge : 'hello'; // $hogeは存在しないので、「??」の右の値が返る
  echo $res.PHP_EOL;
}

exists(); // hello と出力される

せっかくなので三項演算子の話をすると、この演算子は省略形の書き方が存在します。

1行でかけるくせに何を省略するのかと思われるかもしれませんが、最初に示した三項演算子のプログラムの例は実は下記のような書き方ができるのです。

これの動作はnull合体演算子と同じようにみれば良いです。「?:」の左にある値が「true」と判定されたらその値が、「false」と判定されたら「?:」の右にある値が返ります。

function hello($str = null) {
  $res = $str ?: 'hello';
  echo $res.PHP_EOL;
}

hello(); // hello と出力される
hello('test'); // test と出力される

つまりこのような関数の例だと三項演算子を使ってもnull合体演算子を使っても同じなわけです。

評価対象の変数の「存在判定」までするかどうかで両者を使い分けると簡潔でわかりやすいプログラムを書くことができると思います。

まとめ

今回はPHP7で新たに追加された2つの演算子についての解説をしました。新しい機能ですので知らない方も多いかもしれませんね。

しかし知らないからといって便利な機能を使わずにいるのは非常にもったいないことです。

是非PHP7を使う際には新しい演算子を駆使して簡潔なプログラムを書きましょう!


PHPの最新バージョン「PHP7」の基本知識を動画で学ぶなら・・・・

なかなかイメージしにくいな、という方には動画学習も効果的です。

オススメなUdemyの動画です。定期的に割引キャンペーンが行われるのでお得に学習できます。

【2日でできる】はじめての PHP超入門

ぽこ子

他にも人気の人工知能や機械学習など、様々な分野の動画がラインナップされています。気になる方はご覧になってくださいね。

世界最大級のオンライン学習サイトUdemy