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」いれるのもしんどい。