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

PHP中如何用Reflection的invoke()替代$this动态调用类final方法

解决方案

你只需要调整循环内的调用逻辑,使用ReflectionMethod实例自带的invoke()方法即可,调整后的完整代码如下:

$shop_id = $shop_id ? $shop_id : $this->shop_id;
$shop = Shop::whereId($shop_id)->first();
$total_rating = 0;
$averageRatingCalculator = new AverageRatingCalculator($shop_id);
$reflection_class = new ReflectionClass($averageRatingCalculator);
$final_class_methods = $reflection_class->getMethods(ReflectionMethod::IS_FINAL);
foreach($final_class_methods as $method){
    // 若final方法定义在AverageRatingCalculator类中,第一个参数传$averageRatingCalculator
    // 若final方法定义在当前类中,第一个参数传$this即可
    $total_rating += $method->invoke($this);
}

补充说明

  • 如果你的final方法需要传入参数,直接按顺序写在invoke()第一个参数之后即可,比如$method->invoke($this, $param1, $param2)
  • 注意你当前反射获取的是AverageRatingCalculator类的final方法,如果这些方法实际属于当前类,建议将反射类调整为当前类,避免后续新增方法后出现调用异常:
    // 反射当前类的示例
    $reflection_class = new ReflectionClass(self::class);
    

内容的提问来源于stack exchange,提问作者Milad pegah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:45:02