PHPのメモ帳です。
402 views
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に置き換えてみましょう。
以下のようになります。
<?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/