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

如何将父类protected函数作为callable参数传入方法?

解决PHP中传递父类protected方法作为callable参数的问题

你尝试的三种方式都存在语法或权限层面的问题,正确的解决方法如下:

可行方案:用Closure::fromCallable()包装方法

由于父类的protected方法仅能在继承链内部访问,直接传递数组格式的callable会在Routes::setup的外部上下文触发权限限制。使用Closure::fromCallable()可以保留当前子类的访问权限,生成合法的callable:

Routes::setup($router, $injector, Closure::fromCallable([$this, 'toRouterCallable']));

分析之前的错误原因

  • $this->toRouterCallable:错误将方法当作对象属性访问,toRouterCallable是方法而非属性,因此报“未定义属性”。
  • parent::toRouterCallable:把方法名当作类常量引用,类常量与方法是完全不同的语法元素,属于语法错误。
  • [$this, 'toRouterCallable']:这是PHP表示对象方法的标准callable格式,但Routes类不属于你的类继承链,无法在其静态方法内部访问父类的protected方法,导致类型检查或调用失败。

替代方案:匿名函数包装

也可以用匿名函数手动包装调用逻辑,效果与Closure::fromCallable()一致:

Routes::setup($router, $injector, function(...$args) {
    return $this->toRouterCallable(...$args);
});

内容的提问来源于stack exchange,提问作者Cardinal System

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:46:01