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 full-size slide

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

    @Ykanoh65

    株式会社 ラクス

    所 属

    お仕事

    その他

      Twitter

    ダイビング #PHPTechCafe 主催 

    カノウユウジ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  21. 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 full-size slide

  22. Question. 3
    __set()

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  30. 39
    バランス
    要は

    View full-size slide

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

    View full-size slide