Listening to the Words

PHP魔术方法之__invoke()

看以下代码,__invoke()方法是做什么的,相信很多人没有用到过:

class ConfigProvider
{
    public function __invoke(): array
    {
        return [
            'dependencies' => [
                ApplicationInterface::class => ApplicationFactory::class,
                StdoutLoggerInterface::class => StdoutLogger::class,
            ],
            'annotations' => [
                'scan' => [
                    'paths' => [
                        __DIR__,
                    ],
                ],
            ],
        ];
    }
}

官方手册的解释:

__invoke()

__invoke ([ $… ] ) : mixed
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。

Note:
本特性只在 PHP 5.3.0 及以上版本有效。

上代码:

定义一个类 TestController,没有任何方法,只有一个魔术方法被实现:

<?php

namespace App\Controller;
/**
 * Class TestController
 * @package App\Controller
 */
class TestController
{
    /**
     * @return array
     */
    public function __invoke ()
    {
        return [
            "config" => [1, 2, 3],
            TestController::class => TestController::class,
        ];
    }

}

在入口里执行:

$ss= (new TestController())();
var_dump($ss);

输出:

array(2) { [“config”]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } [“App\Controller\TestController”]=> string(29) “App\Controller\TestController” }

see,像执行函数一样来执行一个对象,系统就会自动调用这个方法。

使用场景

在hyperf和swoft框架中,他被用来执行获取Provider的配置,然后加载进容器作为解析对象依赖的配置;

class ConfigProvider
{
    public function __invoke(): array
    {
        return [
            'dependencies' => [
                ApplicationInterface::class => ApplicationFactory::class,
                StdoutLoggerInterface::class => StdoutLogger::class,
            ],
            'annotations' => [
                'scan' => [
                    'paths' => [
                        __DIR__,
                    ],
                ],
            ],
        ];
    }
}
点赞