如何在原生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
相关产品推荐
相关产品推荐

