php7で追加した新特性を紹介します。
宇宙船演算子
宇宙船演算子は、二つの式を比較するために使うものです。 $a が $b より大きい場合は 1、 $a と $b が等しい場合は 0、 $a が $b より小さい場合は -1 をそれぞれ返します。
<?php
// 整数値
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮動小数点数値
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 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮動小数点数値
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
?>
Null 合体演算子
null 合体演算子 (??
) がシンタックスシュガーとして追加されました。 三項演算子と isset() を組み合わせる よくありがちなパターンを、より簡単に書くためのものです。 この演算子は、もし第一オペランドが非 null
の値であればそれを返し、 そうでない場合は第二オペランドを返します。
<?php
// $_GET[‘user’] を取得します。もし存在しない場合は
// ‘nobody’ を用います。
$username = $_GET[‘user’] ?? ‘nobody’;
// 上のコードは、次のコードと同じ意味です。
$username = isset($_GET[‘user’]) ? $_GET[‘user’] : ‘nobody’;
// 合体演算子を連結することもできます。次のように書くと、
// $_GET[‘user’]、$_POST[‘user’] そして ‘nobody’
// の順に調べて、非 &null; が定義されている最初の値を返します。
$username = $_GET[‘user’] ?? $_POST[‘user’] ?? ‘nobody’;
?>
// $_GET[‘user’] を取得します。もし存在しない場合は
// ‘nobody’ を用います。
$username = $_GET[‘user’] ?? ‘nobody’;
// 上のコードは、次のコードと同じ意味です。
$username = isset($_GET[‘user’]) ? $_GET[‘user’] : ‘nobody’;
// 合体演算子を連結することもできます。次のように書くと、
// $_GET[‘user’]、$_POST[‘user’] そして ‘nobody’
// の順に調べて、非 &null; が定義されている最初の値を返します。
$username = $_GET[‘user’] ?? $_POST[‘user’] ?? ‘nobody’;
?>
戻り値の型宣言
PHP 7 では、 戻り値の型宣言 もできるようになりました。 引数の型宣言 と同様に、戻り値の型宣言では、関数が戻す値がどの型になるかを宣言します。 戻り値の型宣言で使える 型 は、引数の型宣言で使えるものと同じです。
<?php
function arraysSum(array …$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
function arraysSum(array …$arrays): array
{
return array_map(function(array $array): int {
return array_sum($array);
}, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));
define() を用いた配列定数の定義
define() で配列の定数を定義できるようになりました。 PHP 5.6 までのバージョンでは、配列の定数は const
でしか定義できませんでした。
<?php
define(‘ANIMALS’, [
‘dog’,
‘cat’,
‘bird’
]);
echo ANIMALS[1]; // “cat” と出力します
?>
define(‘ANIMALS’, [
‘dog’,
‘cat’,
‘bird’
]);
echo ANIMALS[1]; // “cat” と出力します
?>
Closure::call()
Closure::call() は、オブジェクトのスコープをクロージャに一時的に束縛して実行するための、 より高性能で簡潔な方法です。
<?php
class A {private $x = 1;}
// 以前のバージョンのコード
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, ‘A’); // 中間クロージャが必要
echo $getXCB();
// PHP 7 以降でのコード
$getX = function() {return $this->x;};
echo $getX->call(new A);
class A {private $x = 1;}
// 以前のバージョンのコード
$getX = function() {return $this->x;};
$getXCB = $getX->bindTo(new A, ‘A’); // 中間クロージャが必要
echo $getXCB();
// PHP 7 以降でのコード
$getX = function() {return $this->x;};
echo $getX->call(new A);
intdiv() による整数の除算
新しい intdiv() 関数は、 オペランドに対して整数の除算を行い、その結果を返します。
<?php
var_dump(intdiv(10, 3));
?>
var_dump(intdiv(10, 3));
?>