You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在原生PHP中实现类似Laravel的方法链式调用功能?

原生PHP实现链式调用的方法

链式调用的核心逻辑非常简单:所有支持链式调用的方法,在执行完自身逻辑后返回当前实例对象$this,后续方法就可以直接在返回的实例上继续调用,不需要单独赋值变量再调用。


1. 普通实例链式调用

直接在类的普通方法末尾返回$this即可,示例如下:

class Calculator
{
    private int $result = 0;

    public function add(int $num): self
    {
        $this->result += $num;
        // 核心:返回当前实例,支持后续链式调用
        return $this;
    }

    public function sub(int $num): self
    {
        $this->result -= $num;
        return $this;
    }

    public function multiply(int $num): self
    {
        $this->result *= $num;
        return $this;
    }

    // 最终获取结果的方法不需要返回实例
    public function getResult(): int
    {
        return $this->result;
    }
}

调用示例:

$calc = new Calculator();
// 链式调用输出计算结果
echo $calc->add(5)->multiply(2)->sub(3)->getResult(); // 输出:7

2. 静态方法开头的链式调用(对应Laravel Facade用法)

你在Laravel里见到的Route::get()->name()->middleware()这种静态方法开头的链式调用,只需要让静态入口方法返回类的实例,后续的实例方法继续返回$this即可,示例如下:

class Route
{
    private string $path;
    private string $routeName;
    private array $middlewares = [];

    // 静态入口方法,返回自身实例
    public static function get(string $path): self
    {
        $instance = new self();
        $instance->path = $path;
        return $instance;
    }

    public function name(string $name): self
    {
        $this->routeName = $name;
        return $this;
    }

    public function middleware(array|string $middleware): self
    {
        array_push($this->middlewares, ...(array)$middleware);
        return $this;
    }
}

调用示例和Laravel用法完全一致:

Route::get('/user/list')
    ->name('user.list')
    ->middleware(['auth', 'check.permission']);

补充:实现无括号的属性式链式调用

如果你要实现类似Class::method1()->method2->method3()这种不带括号的属性调用形式,可以通过魔术方法__get()实现:

public function __get(string $name)
{
    // 如果存在对应方法且不需要参数,直接调用后返回实例
    if (method_exists($this, $name)) {
        return $this->$name();
    }
    return $this;
}

内容的提问来源于stack exchange,提问作者annajm albupy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:36:01