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

PHPマジックメソッドクイズ!/PHP Magic Method Quiz

Y-KANOH
March 25, 2023

PHPマジックメソッドクイズ!/PHP Magic Method Quiz

PHPに存在する "魔法のような" メソッド「マジックメソッド」。
普段はあまり気にしなくても、フレームワークやライブラリのコードを読むときに、見慣れないメソッドが出てきて処理を追う手が止まってしまったことはありませんか?
一つ上のPHPerになるために、これを機にマジックメソッドについての理解を深めましょう!!
本セッションではいくつかのマジックメソッドについて、クイズ形式でその効果や利用方法を説明します。

Y-KANOH

March 25, 2023
Tweet

More Decks by Y-KANOH

Other Decks in Technology

Transcript

  1. The PHP
    Magic Methods Quiz
    PHP マジックメソッドクイズ
    株式会社 ラクス
    加納悠史

    View Slide

  2. 加納 悠史
    PHP / 設計 / オフショア 

    @Ykanoh65

    株式会社 ラクス

    所 属

    お仕事

    その他

      Twitter

    ダイビング #PHPTechCafe 主催 

    カノウユウジ

    View Slide

  3. 3

    View Slide

  4. 4
    来週火曜!!
    テーマ:
    PHPerKaigi 振り返り!

    View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. マジックメソッドとは?
    オブジェクトに対して
    特定の動作が行われた時に
    PHPデフォルト動作を上書きして実行される
    特別で 魔法のような メソッド
    8

    View Slide

  9. PHPのマジックメソッド
    全17種
    __construct()
    __destruct()
    __call()
    __callStatic()
    __get()
    __set()
    __isset()
    __unset()
    __sleep()
    __wakeup()
    __serialize()
    __unserialize()
    __toString()
    __invoke()
    __set_state()
    __clone()
    __debugInfo()

    View Slide

  10. PHPのマジックメソッド
    全17種
    __construct()
    __destruct()
    __call()
    __callStatic()
    __get()
    __set()
    __isset()
    __unset()
    __sleep()
    __wakeup()
    __serialize()
    __unserialize()
    __toString()
    __invoke()
    __set_state()
    __clone()
    __debugInfo()

    View Slide

  11. __construct()
    動作タイミング:
    オブジェクトが生成された時
    主な用途:
    オブジェクトの初期化処理
    11

    View Slide

  12. PHPのマジックメソッド
    全17種
    __construct()
    __destruct()
    __call()
    __callStatic()
    __get()
    __set()
    __isset()
    __unset()
    __sleep()
    __wakeup()
    __serialize()
    __unserialize()
    __toString()
    __invoke()
    __set_state()
    __clone()
    __debugInfo()

    View Slide

  13. __toString()
    動作タイミング:
    クラスが文字列に変換された時
    13
    class Hoge {
    public function __toString() {
    return "Text!!!";
    }
    }
    $hoge = new Hoge();
    echo $hoge; // 実行結果:Text!!!

    View Slide

  14. PHPのマジックメソッド
    全17種
    __construct()
    __destruct()
    __call()
    __callStatic()
    __get()
    __set()
    __isset()
    __unset()
    __sleep()
    __wakeup()
    __serialize()
    __unserialize()
    __toString()
    __invoke()
    __set_state()
    __clone()
    __debugInfo()

    View Slide

  15. PHP
    15

    View Slide

  16. PHP
    16
    マジックメソッド

    View Slide

  17. PHP
    17
    マジックメソッド

    View Slide

  18. Question. 1
    このメソッドの実行タイミングは??

    View Slide

  19. Question. 1
    このメソッドの実行タイミングは??
    __debugInfo()

    View Slide

  20. __debugInfo() の
    実行タイミングは??
    A
    スタックトレース
    出力時
    B
    Xdebugが
    ONになっている時の
    オブジェクト生成時
    C
    var_dump() で
    出力されるとき
    20

    View Slide

  21. A
    スタックトレース
    出力時
    B
    Xdebugが
    ONになっている時の
    オブジェクト生成時
    C
    var_dump() で
    出力されるとき
    21
    __debugInfo() の
    実行タイミングは??

    View Slide

  22. 22
    __debugInfo()
    class User {
    private $name = "お名前";
    private $mail = "[email protected]";
    private $bigObj; // なんかおっきなの
    public function __debugInfo() {
    return [
    "name" => $this->name,
    "mail" => "教えないよ",
    ];
    }
    }
    $user = new User();
    var_dump($user);
    実行結果
    object(User)#1 (2) {
    ["name"]=>
    string(4) "お名前"
    ["mail"]=>
    string(3) "教えないよ"
    }

    View Slide

  23. Question. 2

    View Slide

  24. Question. 2
    このメソッドの実行タイミングについて
    __call()

    View Slide

  25. __call() の実行タイミングとして
    間違っているものは?
    25
    A 定義されていないプロパティを呼ぼうとした時
    B 定義されていないメソッドを呼ぼうとした時
    C privateメソッドに外部からアクセスしようとした時

    View Slide

  26. __call() の実行タイミングとして
    間違っているものは?
    26
    誤 A 定義されていないプロパティを呼ぼうとした時
    正 B 定義されていないメソッドを呼ぼうとした時
    正 C privateメソッドに外部からアクセスしようとした時

    View Slide

  27. 27
    __call()
    class Car {
    private int $speed;
    public function __call($name,$args) {
    echo "いたしません\n";
    }
    private function speedUp() {
    $this->speed++;
    }
    }
    $car = new Car();
    $car->speedUp(); // プライベート
    $car->jumpUp(); // そんなメソッドはない
    実行結果
    いたしません
    いたしません
    アクセス不能メソッドに
    アクセスした時に起動

    View Slide

  28. Question. 3

    View Slide

  29. Question. 3
    __set()

    View Slide

  30. __set()
    30
    class hoge
    {
    public function __set(string $name, mixed $value)
    {
    echo "そんなプロパティはねえ!";
    }
    }
    $hoge = new hoge();
    $hoge->invalid = 1; // 実行結果:そんなプロパティはねえ!

    View Slide

  31. 次の実行結果は?
    31
    A  (なにも表示されない)
    B そんなプロパティはねぇ
    C エラーになる
    class hoge
    {
    public function __set(
    string $name,
    mixed $value
    )
    {
    return "そんなプロパティはねぇ";
    }
    }
    $hoge = new hoge();
    $hoge->invalid = 1;

    View Slide

  32. 次の実行結果は?
    32
    A  (なにも表示されない)
    B そんなプロパティはねぇ
    C エラーになる
    class hoge
    {
    public function __set(
    string $name,
    mixed $value
    )
    {
    return "そんなプロパティはねぇ";
    }
    }
    $hoge = new hoge();
    $hoge->invalid = 1;

    View Slide

  33. 33
    https://www.php.net/manual/ja/language.oop5.overloading.php#object.set

    View Slide

  34. 明日から使おう
    マジックメソッド

    View Slide

  35. 明日から使おう
    マジックメソッド

    View Slide

  36. 乱用は勧めません
    ✣ フレームワークなどの内部処理用
    ✣ 可読性を下げる可能性も
    ✣ 予想できない動きと捉えられる
    36
    ご利用は計画的に

    View Slide

  37. 37

    View Slide

  38. 38
    要は

    View Slide

  39. 39
    バランス
    要は

    View Slide

  40. 40
    来週火曜!!
    テーマ:
    PHPerKaigi 振り返り!

    View Slide