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
相关产品推荐
相关产品推荐

