前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP __invoke 使用

PHP __invoke 使用

作者头像
Yifans_Z
发布2023-08-23 18:49:23
1470
发布2023-08-23 18:49:23
举报

why they are magic? Because they are magically called by PHP when specific actions happen.

The __invoke() method is called when a script tries to call an object as a function.

代码语言:javascript
复制
<?php
class CallableClass
{
    public function __invoke($x)
    {
        var_dump($x);
    }
}
$obj = new CallableClass;
$obj(5);
var_dump(is_callable($obj));
代码语言:javascript
复制
int(5)
bool(true)

使用明显的操作方法初始化

例如,当我们有一个提供者时,就会发生这种情况。

aws-sdk-php/src/Endpoint/PatternEndpointProvider.php

代码语言:javascript
复制
public function __invoke(array $args = [])
{
    $service = isset($args['service']) ? $args['service'] : '';
    $region = isset($args['region']) ? $args['region'] : '';
    $keys = ["{$region}/{$service}", "{$region}/*", "*/{$service}", "*/*"];

    foreach ($keys as $key) {
        if (isset($this->patterns[$key])) {
            return $this->expand(
                $this->patterns[$key],
                isset($args['scheme']) ? $args['scheme'] : 'https',
                $service,
                $region
            );
        }
    }

    return null;
}

它使用 invoke 使用一些参数提供端点。我们如何使用这个类?

代码语言:javascript
复制
public function testReturnsNullWhenUnresolved()
{
    $e = new PatternEndpointProvider(['foo' => ['rules' => []]]);
    $this->assertNull($e(['service' => 'foo', 'region' => 'bar']));
}

尝试使用单动作控制器?

控制器应该大而广泛?他们不应该。我们应该有瘦控制器和胖服务。

在这里,invoke 可以帮助我们,因为我们可以定义一个只处理单个动作的控制器,并在其上放置单个 invoke 方法。

这也有助于我们实现单一职责原则,即 SOLID 中的 S,这是前五个面向对象设计 (OOD) 原则的首字母缩写词。

A class should have one and only one reason to change, meaning that a class should have only one job.

在 Laravel 中的例子:Single Action Controllers | laravel

代码语言:javascript
复制
<?php

namespace App\Http\Controllers;

use App\User;
use App\Http\Controllers\Controller;

class ShowProfile extends Controller
{
    /**
     * Show the profile for the given user.
     *
     * @param  int  $id
     * @return View
     */
    public function __invoke($id)
    {
        return view('user.profile', ['user' => User::findOrFail($id)]);
    }
}

然后,在注册路由时,我们不需要指定方法名称。只有类名。

代码语言:javascript
复制
<?php
Route::get('user/{id}', 'ShowProfile');

This way we can have Single Action Controllers.

References

– EOF –

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用明显的操作方法初始化
  • 尝试使用单动作控制器?
  • References
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档