PHP链式调用方法中如何实现接受闭包回调并更新内部属性
实现思路
- 所有可链式调用的实例方法,执行完毕后统一返回
$this本身,支撑链式调用语法 - 静态入口方法(
wherePage/pages)先创建Foo类实例,执行完对应逻辑后返回实例,开启链式调用 - 每个方法接收闭包参数时,会把当前最新的内部属性作为参数传给闭包执行,闭包内对属性的修改会直接同步到类的内部状态,后续调用可以直接拿到更新后的值
完整代码实现
class Foo { // 设为protected禁止外部直接修改,仅能通过类内方法更新状态 protected Pages $pages; protected Owners $owners; // 构造方法按需初始化pages和owners,可根据业务调整初始化逻辑 public function __construct() { $this->pages = new Pages(); $this->owners = new Owners(); } // 静态入口方法:匹配指定page public static function wherePage(string $pageName, ?callable $callback = null): self { $instance = new self(); // 示例业务逻辑:从pages集合中获取指定名称的page $matchedPage = $instance->pages->getByName($pageName); // 执行传入的闭包,传入当前匹配到的page和最新的owners属性 if ($callback !== null) { $callback($matchedPage, $instance->owners); } return $instance; } // 静态入口方法:操作全量pages public static function pages(?callable $callback = null): self { $instance = new self(); if ($callback !== null) { // 传入当前最新的pages和owners给闭包 $callback($instance->pages, $instance->owners); } return $instance; } // 链式方法:操作owners属性 public function b(callable $callback): self { $callback($this->owners); return $this; } // 结果获取方法:终止链式调用返回最终结果 public function getPagesArray(): array { return $this->pages->toArray(); } }
补充说明
如果需要闭包内对属性的修改直接同步到类的内部状态,可以给闭包参数加引用标识 &,示例写法:
$pagesArray = Foo::pages(function (&$pages, $owners) { // 这里对$pages的修改会直接更新Foo实例的$pages属性 $pages->add(new Page()); })->getPagesArray();
内容的提问来源于stack exchange,提问作者aamuller
相关产品推荐
相关产品推荐

