[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';
    }
}

古いコードで見られることがありますが、この形式のコンストラクタを使っているようなコードがあれば、それは長期間メンテナンスされていないということを意味しますので、そのようなコードを初心者は利用しないことをお勧めします。

参考ページ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です