Upgrade to Pro — share decks privately, control downloads, hide ads and more …

🪝 便利な Property Hooks を 使ってみよう 🪝

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for SAW SAW
April 24, 2026

🪝 便利な Property Hooks を 使ってみよう 🪝

第53回関西PHP勉強会 の発表資料です。

Avatar for SAW

SAW

April 24, 2026

More Decks by SAW

Other Decks in Programming

Transcript

  1. $whoami 氏名: 加藤 宗一郎 (32歳) ハンドルネーム: SAW X (旧 Twitter):

    @azuki_eater 関西の IT エンジニア コミュニティの賑やかし 大阪在住・愛知出身 得意分野: Web アプリケーション開発 Laravel, Vue 所属: 有限会社アリウープ 本日の迷言のコーナーはお休みです。 2 / 16
  2. Property Hooks とは オブジェクトのプロパティの読み書きの挙動を変更できる機能 Laravel Eloquent の Acceessors/Mutators のような機能 プロパティから自動的に計算した値を取得したい時に便利

    例: 身長と体重から BMI を自動計算 PHP 8.4 で追加 class Person { public function __construct( public float $height, public float $weight, ) { } public float $bmi { get => $this->weight / pow($this->height / 100, 2); } } $person = new Person(170.5, 60.3); echo sprintf("%.2f", $person->bmi) . PHP_EOL; # 出力: 20.74 5 / 16
  3. Property Hooks の文法 (getter) 基本文法: <アクセス修飾子> <型名> <プロパティ名> { get

    { 文 } } 短縮構文: <アクセス修飾子> <型名> <プロパティ名> { get => 式 ; } プロパティ名の後ろがブロック ( {} ) で終わる 通常のプロパティはセミコロン ( ; ) で終わる ブロック内に get ブロック ( get {} ) を入れる ブロック内には任意の文を入れられる 式を返すだけの場合は短縮構文が利用可能 アロー関数のような記法 アクセス時は通常のプロパティと同様に記述する $example->fullName のように記述 class Example { public function __construct( public string $firstName, public string $lastName, ) { } public string $fullName { get { $firstName = ucfirst($this->firstName); $lastName = ucfirst($this->lastName); return $firstName . ' ' . $lastName; } } } 6 / 16
  4. Property Hooks の文法 (setter) 基本文法: <アクセス修飾子> <型名> <プロパティ名> { set

    (型名 変数名) { 文 } } 短縮構文: <アクセス修飾子> <型名> <プロパティ名> { set => 式 ; } setter も getter と同様に記述 ブロック内に set ブロック ( set {} ) を入れる 通常のプロパティと同様に代入 $example->sound = 'bzz' のように記述 式を代入するだけの場合は短縮構文が利用可能 アロー関数のような記法 (getter と同様) 元の値は $value に暗黙的に格納されている class Example { public function __construct( ) { } public string $sound { set(string $value) { if ($value === 'tick-tock') { echo "Smee!" . PHP_EOL; } $this->sound = $value; } } } 7 / 16
  5. コンストラクタで property hooks の機能を利用 コンストラクタの引数に property hooks が定義可能 対応する引数が property

    hooks の setter に渡される class Example { public function __construct( public private(set) string $firstName { set => ucfirst($value); }, public private(set) string $lastName { set => ucfirst($value); }, ) { } } $ex = new Example('charlie', 'brown'); echo $ex->firstName . PHP_EOL; # 出力例: Charlie echo $ex->lastName . PHP_EOL; # 出力例: Brown 10 / 16
  6. Q. 以下のプログラム例を実行した時の値の対応関係で正しいものはどれでしょう? $qs1 $qs2 ❌ 1 page=1 page=1 ⭕️ 2

    page=1 page=5 ❌ 3 page=5 page=1 ❌ 4 page=5 page=5 use Uri\WhatWg\Url; class Example { private static string $origin = 'https://example.com'; public function __construct( public int $page, ) { } public Url $url { get => new Url(self::$origin."?page={$this->page}"); } } $example = new Example(1); $url1 = $example->url; $example->page = 5; $url2 = $example->url; $qs1 = $url1->getQuery(); $qs2 = $url2->getQuery(); 12 / 16
  7. クイズの解説 virtual property になっていて値を保持しない virtual property: getter, setter のどちらの hooks

    でも自身のプロパティを参照しない 値が保持されず getter を参照するたびにインスタンスが new された $qs1 と $qs2 で別々のインスタンスが生成されていた virtual property は値の保持が不要な場合に有用 他の property から自動計算できる値 例: BMI (体重と身長) 13 / 16
  8. まとめ property hooks の機能について説明 基本的な構文 (getter, setter) constructor property promotion

    を応用した使い方の紹介 virtual property の特徴を説明 クイズ形式で挙動を解説 14 / 16
  9. 宣伝 Laravel Live Japan 2026 開催予定 日付: 2026/5/26 (火), 2026/5/27

    (水) 場所: 立川ステージガーデン 一般参加チケット・懇親会チケット発売中 当日スタッフ募集中