如何将父类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
相关产品推荐
相关产品推荐

