今日のぺちぱー

PHPのメモ帳です。

185 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。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。

サイト/ブログ

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

ツイッター

@darkimpact0626