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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:24:03