🪝

PHP8.4 新機能プロパティフックについて簡単にまとめる

2024/12/08に公開

概要

PHP 8.4から、プロパティフックという新しい機能が追加されました。
プロパティの取得や設定時に処理を挟むことができるようになり、ゲッターやセッターを省略できる場面が増えそうです。

使い所

入力値のバリデーション・プロパティ取得時のデータ整形など、かなり多岐にわたると思います。
Customerクラスのemailプロパティで、メールアドレス形式だけを受け付けたいという場面を例に見ていきます。

プロパティフックを使わない場合

PHP 8.4以前は、ゲッターとセッターを定義してプロパティへのアクセスを制御するのが一般的でした。

実装例

<?php

class Customer
{
    private string $email;

    /**
    * ゲッターメソッド
    */
    public function getEmail(): string
    {
        return $this->email;
    }


    /**
    * セッターメソッド
    */
    public function setEmail(string $email): void
    {
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException("不正なメールアドレス形式です。");
        }
        $this->email = $email;
    }
}

$user = new Customer();

$user->setEmail('test@example.com');

echo $user->getEmail();
  • setEmailでバリデーションを行い、問題なければ値を設定します。
  • 必要なことはできるのですが、プロパティごとにゲッター・セッターメソッドが増えてしまうのがネックでした。

プロパティフックを使う場合

PHP 8.4では、プロパティフックを使うことで、ゲッターやセッターの処理をプロパティ内に直接書けるようになりました。

<?php

class Customer
{
    public string $email {
        get {
            return $this->email;
        }
        set(string $email) {
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                throw new InvalidArgumentException("不正なメールアドレス形式です。");
            }
            $this->email = $email;
        }
    }
}

$user = new Customer();

$user->email = 'test@example.com';
echo $user->email;
  • ゲッターとセッターを直接プロパティ内に記述することで、コードを簡潔にまとめられます。
  • メソッドではなくプロパティとしてアクセスできるので、より直感的に操作できる感じがします。

プロパティフックの他記法

$valueを使った簡略化

セッターでは値が暗黙的に$valueとして渡されるので、次のようにも書けます。

set {
    if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
        throw new InvalidArgumentException("不正なメールアドレス形式です。");
    }
    $this->email = $value;
}

アロー構文を使う
取得や設定が1行で済む場合は、アロー構文でさらに短く書けます。

get => $this->email;

まとめ

プロパティフックを使うと、ゲッターやセッターを個別に定義するよりもコードがすっきりする印象です。
プロパティに対して簡単なバリデーションや条件を設定したいときに良さそうだと感じました。
ただロジックを書きすぎてしまうとプロパティ定義がファットになり、一覧性が下がる感じもしたので、長くなる処理は別メソッドに切り出すなどの工夫は必要かなと思いました。

Discussion