[PHP Demystified] PHP でプログラミングする人が知っておくべき PHP 7/PHP 8 の新機能
特に気になるものについて取り上げています。完全なリストについては各バージョンでの参考ページを参照してください。
PHP 8.0
名前付き引数
名前付き引数のサポートが追加されました。例えば
<?php
function sample($foo = null, $bar = false, $baz = 0, $qux = '') {}
というような関数があった場合、これまでは
<?php
sample(null, false, 0, 'quux');
のように後ろの引数は何か指定したいけど、それ以外はデフォルト値でいいような場合にデフォルト値を書く必要がありましたが、これを
<?php
sample(qux: 'quux');
と書くことができるようになりました。またこれにより、名前付き引数で関数を呼び出す際には引数の順番を考える必要がなくなりました。
<?php
sample(baz: 100, qux: 'quux', bar: true);
nullsafe 演算子
nullsafe 演算子が追加されました。これにより
<?php
$quux = $foo?->bar?->baz()?->qux;
のように書くと、null
が入ってくるようなメソッドチェーンに関しても null
チェックをせずに書くことができるようになりました。
union 型 / mixed 型
union 型や mixed 型のサポートが追加されました。union 型では2つ以上の型を受け付けることができます。
<?php
function double(int|float $number): int|float
{
return $number * 2;
}
echo double(2); // 4
echo double(4.4); // 8.8
mixed 型というのは要は何でもありの型です。PHP 8.0.0 時点での利用可能な型宣言は以下の通りになっています。
型 | 利用可能なPHPの最低バージョン |
---|---|
クラス名/インターフェース名 | 5.0.0 |
self |
5.0.0 |
array |
5.1.0 |
callable |
5.4.0 |
bool |
7.0.0 |
float |
7.0.0 |
int |
7.0.0 |
string |
7.0.0 |
iterable |
7.1.0 |
object |
7.2.0 |
mixed |
8.0.0 |
参考ページ
PHP 7.4
新機能
アロー関数
暗黙的な値スコープをもった関数を定義することができるアロー関数が導入されました。
<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]); // [10, 20, 30, 40]
配列のスプレッド構文
JavaScript では ES2015 で導入された配列のスプレッド構文ですが、PHP では 7.4 で導入されました。
<?php
$color_parts = ['blue', 'yellow'];
$colors = ['white', ...$color_parts, 'red'];
型付きプロパティ
クラスのプロパティで型宣言がサポートされるようになりました。
<?php
class Foo {
public int $id;
public string $name;
}
参考ページ
PHP 7.3
新機能
ヒアドキュメントと Nowdoc 構文
文字列を閉じるマーカーの後に、セミコロンや改行文字を続ける必要がなくなりました。さらに、文字列を閉じるマーカーがインデントされていても構わないようになりました。
参考ページ
PHP 7.2
object
型
任意のオブジェクトに対するパラメータの型付けや返り値の型付けに object
型が追加されました。PHP 7.2.0 時点での利用可能な型宣言は以下の通りです。
型 | 利用可能なPHPの最低バージョン |
---|---|
クラス名/インターフェース名 | 5.0.0 |
self |
5.0.0 |
array |
5.1.0 |
callable |
5.4.0 |
bool |
7.0.0 |
float |
7.0.0 |
int |
7.0.0 |
string |
7.0.0 |
iterable |
7.1.0 |
object |
7.2.0 |
名前空間のグループ指定における最後のカンマの許可
PHP 7.0 で導入されたグループ指定構文で、最後にカンマをつけられるようになりました。
<?php
use some\namespace\{
ClassA,
ClassB,
ClassC as C,
};
参考ページ
PHP 7.1
新機能
nullable
な型
型の前にクエスチョンマークをつけることで、指定した型と null
を渡せるようになりました。
function foo(?string $name)
{
var_dump($name);
}
foo('elePHPant'); // string(10) "elePHPant"
foo(null); // NULL
function bar(bool $flag): ?string
{
if ($flag) {
return 'elePHPant';
}
return null;
}
bar(true); // string(10) "elePHPant"
bar(false); // NULL
void
関数
返り値の型に void
が導入されました。返り値が void
である関数からは、空の
return
を使うか何も return
しないかのどちらかになります。
function swap(&$left, &$right): void
{
if ($left === $right) {
return;
}
$tmp = $left;
$left = $right;
$right = $tmp;
}
配列の分割代入
以前は list
関数を使って行っていた操作が、配列の短縮構文を使って行うことができるようになりました。JavaScript では ES2015 で導入されましたが、それの PHP 版です。
<?php
$colors = ['blue', 'yellow', 'red'];
[$blue, $yellow, $red] = $colors;
var_dump($blue); // "blue"
連想配列の分割代入
連想配列でも分割代入ができるようになりました。
<?php
$colors = [
['id' => 1, 'name' => 'blue'],
['id' => 2, 'name' => 'yellow'],
['id' => 3, 'name' => 'red'],
];
['id' => $id1, 'name' => $name1] = $colors[0];
var_dump($id1); // int(1)
var_dump($name1); // string (4) "blue"
クラス定数のアクセス範囲指定
クラス定数でアクセス範囲を指定できるようになりました。
<?php
class ConstDemo
{
const PUBLIC_CONST_A = 1;
public const PUBLIC_CONST_B = 2;
protected const PROTECTED_CONST = 3;
private const PRIVATE_CONST = 4;
}
例外処理における複数の例外の catch
パイプ文字を使用することで、一つの catch ブロックで複数の例外を扱えるようになりました。
<?php
try {
// 何かのコード.
} catch (FirstException | SecondException $e) {
// FirstException と SecondException をこのブロックで処理.
}
参考ページ
PHP 7.0
新機能
スカラー型宣言
関数のパラメータに対してスカラー型の型言が追加されました。
<?php
function sum(int $a, int $b) {
return $a + $b;
}
print_r(sum(1, 2));
PHP 7.0.0 時点での利用可能な型宣言は以下の通りです。
型 | 利用可能なPHPの最低バージョン |
---|---|
クラス名/インターフェース名 | 5.0.0 |
self |
5.0.0 |
array |
5.1.0 |
callable |
5.4.0 |
bool |
7.0.0 |
float |
7.0.0 |
int |
7.0.0 |
string |
7.0.0 |
戻り値の型宣言
関数の戻り値についても型宣言が追加されました。
<?php
function sum(int $a, int $b): int
{
return $a + $b;
}
print_r(sum(1, 2));
Null 合体演算子
三項演算子と isset
関数を組み合わせて利用されていたパターンのシンタックスシュガーとして null 合体演算子が追加されました。例えばこれまで
<?php
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
と書いていたのが、
<?php
$paged = $_GET['user'] ?? 'nobody';
と書けるようになりました。
use
宣言のグループ化
複数のクラスや関数、定数を同じ名前空間からインポートする際に、単一の use
文にまとめることができるようになりました。これにより、以前は
<?php
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
と書いていたものを
<?php
use some\namespace\{ClassA, ClassB, ClassC as C};
と書くことができるようになりました。
非推奨となる機能
PHP4形式のコンストラクタ
クラス名と同じ名前のメソッドをコンストラクタとして定義することが非推奨となりました。
<?php
class foo {
function foo()
{
echo 'I am the constructor';
}
}
古いコードで見られることがありますが、この形式のコンストラクタを使っているようなコードがあれば、それは長期間メンテナンスされていないということを意味しますので、そのようなコードを初心者は利用しないことをお勧めします。