PHPのメモ帳です。
185 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。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。
https://www.osumoi-stdio.com/pyarticle/