PHPの比較演算子で忘れやすいやつ3つ

「三項演算子の短縮形」「Null合体演算子」「宇宙船演算子」のメモ。「null処理するアレの書き方?」で検索に手間取ったことないですか?

1. 三項演算子の短縮形


(expr1) ?: (expr3) 

expr1 が true 同等値の場合は expr1、 それ以外の場合は expr3 となる。
expr1 は一度だけ評価される。

//この場合は同等
$val1 = 'val1';
$val3 = 'val3';
echo $val1 ? $val1: $val3;      //val1
echo $val1 ?: $val3;            //val1
$val1 = '';
$val3 = 'val3';
echo $val1 ? $val1: $val3;      //val3
echo $val1 ?: $val3;            //val3

//func()が実行ごとに違う値を返す場合は注意!
echo func() ? func(): $val2;    //2回目のfunc()
echo func() ?: $val2;           //1回目のfunc()

//チェーンするとtrueになった値が返る ... 公式マニュアルより
echo 0 ?: 1 ?: 2 ?: 3, PHP_EOL; //1
echo 0 ?: 0 ?: 2 ?: 3, PHP_EOL; //2
echo 0 ?: 0 ?: 0 ?: 3, PHP_EOL; //3

2. Null合体演算子


(expr1) ?? (expr2)

expr1 が null である場合は expr2 と評価され、それ以外の場合は expr1 と評価される。
expr1が存在しない場合でも notice や warning が発生しない。

// 公式マニュアルより

// Null合体演算子の使用例
$action = $_POST['action'] ?? 'default';

// 上の文は、この if/else 文と同じ意味です
if (isset($_POST['action'])) {
  $action = $_POST['action'];
} else {
  $action = 'default';
}

3. 宇宙船演算子


$a <=> $b

$a が $b より小さい場合は-1。 $a が $b と等しい場合は0。 $a が $b より大きい場合は1。

ただし、公式マニュアルには−1は「0より小さい整数」、1は「0より大きい整数」と書かれている。今まで−1,0,1以外の値が返ってきたことはないが注意すること。

// 公式マニュアルより

// Integer
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Float
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// 文字列
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

echo "a" <=> "aa"; // -1
echo "zz" <=> "aa"; // 1

// 配列
echo [] <=> []; // 0
echo [1, 2, 3] <=> [1, 2, 3]; // 0
echo [1, 2, 3] <=> []; // 1
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1

// オブジェクト
$a = (object) ["a" => "b"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 0

$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1

$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1

// 比較するのは値だけではない; キーも一致しなければならない
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 1

4. 最後に

時間があるならPHPマニュアル > 言語リファレンス > 演算子で確認する。知識のリフレッシュになるし。

あと、最近は公式マニュアルが検索トップになくて焦ったい。広告多め&対話形式の似たようなページが上位を占めてるとため息が出るよね。検索の度に「site:www.php.net」いれるのもしんどい。