PHP8.4の新機能(非推奨機能と変更点)について

2024年11月19日

新機能、改善点、非推奨機能に加えて、2024年のこの時期(年末)には、PHPのリリースサイクルに調整が加えられます。現在サポートされているすべてのバージョンのセキュリティリリースの終了は、PHPのGA版リリース時ではなく年末に同期されることになる見込み。

PHP8.4のサポートは1年延長のため、2028年まで安全に使うことができます(2年間はセキュリティとバグ修正、2年間はセキュリティ修正のみ)

PHP 8.4の新機能と改善点

昨年リリースされたPHP8.3の新機能は、今回の8.4で導入された一部機能と比較してご紹介。


PHP 8.4で追加された新機能

PHP8.4新機能
プロパティフック

プロパティフックは、PHPのオブジェクト指向プログラミング(OOP)における、「ゲッター(getter)」と「セッター(setter)」の扱いに全く新しいアプローチを導入し、クラスファイルの構造を単純化することを可能にします。

プロパティフックで置き換えられる例として、以下のような$size$flavor。これらのプロパティは、外部から直接アクセスされないようにするため、privateとして設定されています。このため、publicであるgetterメソッドとsetterメソッドがプロパティへのアクセスを仲介します。

class Coffee
{
    private string $size;
    private string $flavor;
    public function __construct(string $size, string $flavor) {
        $this->size   = $size;
        $this->flavor = $flavor;
    }

    // コーヒーのサイズと風味を設定(セット)
    public function setSize(string $size): void {
        $this->size = $size;
    }
    public function setFlavor(string $flavor): void {
        $this->flavor = $flavor;
    }

    // コーヒーのサイズと風味を取得(ゲット)
    public function getSize(): string {
        return $this->size;
    }
    public function getFlavor(): string {
        return $this->flavor;
    }
} // クラス終了

// コーヒーを淹れる
$coffee = new Coffee('スモール', 'パンプキンスパイス');
print $coffee->getSize() . ' ' . $coffee->getFlavor(); // 「スモール・パンプキンスパイス」を出力

// 注文を変更
$coffee->setSize('グランデ');
$coffee->setFlavor('モカ');
print $coffee->getSize() . ' ' . $coffee->getFlavor(); // 「グランデ・モカ」を出力

あるいは、クラスに多くのプロパティがあり、getterメソッドやsetterメソッドを多数書く代わりに、マジックメソッドの_get_setを使用するかもしれません。以下のように、やや雑なswitch文で整理することも可能です。

// __setマジックメソッドの例
public function __set(string $key, $value): void 
    switch ($key) {
        case 'size':
            $this->size = $value;
            break;
        case 'flavor':
            $this->flavor = $value;
            break;
        default:
            throw new InvalidArgumentException('無効な入力です');
        }
}

// 後でコーヒーの順番をこのように変更できる
$coffee->size = 'グランデ';
$coffee->flavor = 'モカ';

どのような方法をとるにしても、クラス内のプロパティの数が多ければ多いほど、 操作するコードは、クラスファイルの先頭付近の定義から遠ざかることになります。
さらに、_get_setマジックメソッドの実装によっては、公開する予定のなかったオブジェクトのprivateプロパティやprotectedプロパティへのアクセスを提供してしまうことも。

新たに導入されるプロパティフックは、ゲッターとセッターの機能をプロパティ自体に組み込みます。以下の例では、Coffeeクラスの$size プロパティと$flavorプロパティがpublicになっていますが、setフックには基本的なバリデーション(チェック機能)が追加され、直接の代入とは区別されています。

// Coffeeクラスのトップにあるプロパティ定義
class Coffee
{
    public string $flavor {
        set(string $value) {
            if (strlen($value) > 16) throw new InvalidArgumentException('入力が長すぎます');
                $this->flavor = $value;
        }
    }

    public string $size {
        set(string $value) {
            if (! in_array($value, array(‘スモール’, ‘グランデ’))) throw new InvalidArgumentException('有効なサイズではありません');
                $this->size = $value;
        }
    }

    // 残りのCoffeeクラス
}

// コーヒーを定義
$coffee = new Coffee();
$coffee->size = 'グランデ';
$coffee->flavor = 'パンプキンスパイス';

PHP8.4新機能
非対称な可視性について

先ほどの一般に公開されている、getterメソッドやsetterメソッドは、クラス内のprivateプロパティやprotectedプロパティにアクセスするための従来のアプローチ。

PHP 8.4の便利な機能として、アクセスされるコンテキストによって、プロパティの可視性のレベルを変更することが可能。つまり、あるプロパティが読み込まれるときにはpublicでも、設定時にはprivateまたはprotectedになるということです。

以下、例

class Coffee
{
    public private(set) string $flavor = 'パンプキンスパイス';
}

$coffee = new Coffee();
print $coffee->flavor;     // 「パンプキンスパイス」を出力
$coffee->flavor = 'モカ';  // エラー(可視性)

この例は、クラスの$flavorプロパティは、設定コンテキスト以外ではpublicです。すでにかなりシンプルですが、非対称の可視性にはさらに便利な方法も。

class Coffee
{
    // コンテキストが設定されていない場合はpublicを想定
    private(set) string $flavor = 'パンプキンスパイス';
}

プロパティフックと非対称の可視性を組み合せて使うことで、さまざまな可視性のオブジェクトプロパティを柔軟に扱うことができます。

PHP8.4新機能
括弧なしのnew連結

短縮形といえば、これまでnewや連鎖メソッドを呼び出すには以下のように括弧でくくる必要がありました。

$coffee = (new Coffee())->getFlavor()->getSize();

PHP8.4では、括弧でくくる必要がなくなります。

$coffee = new Coffee()->getFlavor()->getSize();

小さな変更に思えますが、このちょっとした括弧を削除するだけで可読性が上がり、デバッグしやすくなる事は間違いなしですね。

PHP8.4新機能
④新機能配列の項目を探すための新関数

PHP 8.4ではarray_find()という関数が導入されます。これはコールバック関数で指定された条件に一致するメンバ関数を配列要素から探すことができます。

この関数は、コールバック関数のテストに一致する最初の要素の値を返します。

最後の2つの関数は、配列のキーや内容の代わりに真偽値を返すことに注意してください。

その他、PHP8.4で非推奨となる機能の一つに、Cookieレスセッション追跡なども多くありますが、自社サイトのPHPバージョンがとても低いのでバージョンアップをそれなりの費用で改修したい!という場合は、お気軽にフォーム、ChatWorkからご連絡ください。


Recent Entries

Googleコアアップデートに伴いDiscoverガイドラインを改訂
BingウェブマスターツールにAI引用パフォーマンスデータが追加
リビジョン株式会社は株式会社CCPR(サイバーエージェント子会社)とWebメディア面での提携を開始
アクセス数、定期レポート。Googleコアアップデートの影響は全て好影響に。企業サイトは大幅に増加するチャンス
独立含む、Webサイト新規制作、Webサイトリニューアルをご検討している企業様、ご担当者様へ


CONTACT

Webサイトリニューアルから新規ホームページ制作・運営・保守まで、目的達成を実現いたします。
各種Webサイト・ECサイト制作、広告代行に関するご相談、ご質問などお気軽にお問合せ下さい。

Tel : 03-5324-2318 / Email : info@reinc.jp

各種お問合せはこちらから