无法修改原有类代码,调用内部循环抛异常的方法时如何继续迭代?
解决方案
核心思路
原类的getAliasesFilters方法只要检测到重复别名就会直接抛出异常,不会返回任何中间处理结果,直接调用原方法无法实现跳过异常继续执行的需求。你可以通过PHP反射读取原类的原始过滤数据源,自行实现过滤逻辑,全程不需要修改原有类代码。
具体实现
try { // 先尝试正常调用,没有重复别名时直接走原有逻辑 $this->filters = $x->getFilters(); } catch (FilterException $e) { if ($e->getCode() !== FilterException::MULTIPLE_ALIAS) { // 非重复别名异常按原有逻辑处理 throw $e; } // 触发重复别名异常时,通过反射获取原始数据自行处理 $reflection = new ReflectionClass($x); // 替换为原类中存储过滤器列表的属性名,即getAliasesFilters方法中$filters = ...右侧的属性名 $filtersProp = $reflection->getProperty('filters'); $filtersProp->setAccessible(true); $originalFilters = $filtersProp->getValue($x); $processedFilters = []; foreach ($originalFilters as $filter) { $alias = $filter['alias']; if (array_key_exists($alias, $processedFilters)) { // 自定义重复别名处理逻辑:打日志后跳过 error_log(sprintf('跳过重复的过滤器别名:%s', $alias)); continue; } $processedFilters[$alias] = new FilterDefiniton($filter['filter_id']); } $this->filters = $processedFilters; }
注意事项
- 如果原类的过滤器列表不是存储在类属性中,而是
getAliasesFilters方法内动态生成的,你可以通过反射读取getAliasesFilters的方法体源码,解析出动态获取过滤器的逻辑,自行实现即可。 - 该方案完全在调用侧实现,不会侵入原有类的代码。
内容的提问来源于stack exchange,提问作者LordF
相关产品推荐
相关产品推荐

