今日のぺちぱー

PHPのメモ帳です。

402 views

__invokeの使いどころ

invokeはクラスを関数のように使えるメソッドです。
例えば、次のようなコードを書いたとします。
最下行で$inst()と変数に()を付けて呼び出していますが、このとき
invoke関数が呼ばれます。

<?php

class MagicClass {

    public function __construct() {
        print("コンストラクタ\n");
    }

    public function __invoke() {
        print("invoke\n");
    }
}

$inst = new MagicClass();
$inst();

問題は、invokeの使い道です。
いくら
invokeとにらめっこしても、使い道は見えてきません。
無名関数を理解した上で改めて__invokeを見ると、理解しやすくなります。

無名関数とは

その名のとおり、関数名のない関数です。

$record = [1,2,3,4,5];
array_walk($record, function($data) {
    print("${data}\n");
});

array_walkの第二引数には関数を指定しますが、無名関数はその場で関数を定義して使うことです。
使いどころとしては、ちょっとした処理に無名関数はうってつけです。
反対に無名関数が乱発されたり、意味もなく無名関数が増えると保守が大変ですよね。
使いどころは考えないと保守性がガタガタになるので要注意です。

__invokeに置き換える

上記のコードを__invokeに置き換えてみましょう。
以下のようになります。

<?php

class InvokeController {
    public function __invoke($data) {
        print("${data}\n");
    }
}

$inst = new InvokeController();
$record = [1,2,3,4,5];

array_walk($record, $inst);

無名関数だったところにクラスのインスタンスを当てていますが、このときinvoke関数が呼ばれます。
無名関数の場合は、その場限りの使い捨てメソッドであることに対して、
invokeはインスタンスなのでarray_walkで計算したあともクラスを使用できます。
インスタンスか、使い捨てか。使い道に応じて使いましょう。

Page 8 of 9.

前のページ 次のページ



[添付ファイル]


お問い合わせ

プロフィール

すぺぺぺ

自己紹介

本サイトの作成者。
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
ChatGPTで自動プログラム作成に取り組み中。

サイト/ブログ

https://www.osumoi-stdio.com/novel/

ツイッター

@darkimpact0626