【 PHP 】PHP8に入門してみた 217日目 PHPの基本 ( オブジェクト指向 マジックメソッド その4)

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

オブジェクト指向

まだまだマジック! その4

__invokeメソッド

__invokeメソッドは、オブジェクトを関数のように呼び出すことができるようにするマジックメソッドです。

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8" />
    <title>こんにちは!</title>
    <!-- Bootstrapを有効化 -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
</head>

<body>
    <?php
    class ExampleClass
    {
        private $message;

        public function __construct($message)
        {
            $this->message = $message;
        }

        public function __invoke()
        {
            echo $this->message;
        }
    }

    // ExampleClassオブジェクトを作成
    $obj = new ExampleClass("Hello, world!");

    // __invokeメソッドを呼び出し、"Hello, world!"を出力する
    $obj();

    ?>
</body>

</html>

どんな状況で使うのでしょう?

以下のような場面で使用することができます。

  • コールバック関数として使用する場合
    あるクラスのオブジェクトをarray_map関数のコールバックとして渡したい場合__invokeメソッドを定義しておけば、そのオブジェクトを関数のように呼び出すことができます。

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta charset="UTF-8" />
        <title>こんにちは!</title>
        <!-- Bootstrapを有効化 -->
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
    </head>
    
    <body>
        <?php
        class CallbackExample
        {
            public function __invoke($value)
            {
                return $value * 2;
            }
        }
    
        $numbers = [1, 2, 3, 4, 5];
    
        // CallbackExampleオブジェクトをコールバックとして渡す
        $result = array_map(new CallbackExample, $numbers);
    
        print_r($result);
    
    
        ?>
    </body>
    
    </html>


    CallbackExampleクラスに__invokeメソッドを定義し、渡された引数を2倍にして返すようにしています。
    そして、array_map関数にnew CallbackExampleというコールバックとしてCallbackExampleオブジェクトを渡し$numbers配列の各要素を2倍にします。
    最後に、$result変数に2倍にした配列を格納して出力しています。

  • フレームワークのコントローラとして使用する場合
    __invokeメソッドを定義することで、クラス自体をコントローラとして使用することができます。
    例えば、Slim Frameworkなどの一部のフレームワークでは、コントローラとして__invokeメソッドを実装したクラスを使用することができます。
  • 可読性
    __invokeメソッドはオブジェクト指向プログラミングの柔軟性を高め、コードの可読性を向上させるために使用されることがあります。

メモ

オブジェクトにおいてもっともよく利用されるメソッドを__invokeに設定しておくとよさそうですね。

PHPPHP

Posted by raika@blog