PHP中如何让类内方法感知翻译方法抛出的异常并更新状态?
问题原因与解决方案
核心问题
- 数组值传递导致修改无效:PHP中数组作为函数参数默认是值传递,你调用
translateHTML时传入的$this->status是数组副本,catch块里修改的只是这个副本,完全没触碰到类的原始$status属性。 - 键名不匹配:类的
$status属性用error键标记错误状态,但catch块里却写了$status['status'] = true,键名对应错误。
解决方案
1. 修改trait中的translateHTML方法
直接访问类的$this->status属性(trait可访问使用它的类的protected属性),同时修正键名:
protected function translateHTML(object $translator, string $content, string $target_language): string { if ($target_language == 'en') { return $content; } if ($content): try { $content_translated = $translator->translateText( $content, 'en', $target_language, ['tag_handling' => 'html'], ['formality', 'prefer_less'], ['split_sentences', 0] ); return $content_translated; } catch (Exception $error) { // 直接修改类的status属性,键名改为error $this->status['error'] = true; $this->status['message'] = $error->getMessage(); return $content; } endif; return $content; }
2. 更新translatePostContent的调用
不再传递$status参数:
public function translatePostContent(string $content): string { $post_language = $this->getPostLanguage($this->post_id); $target_language = $post_language['deepl_language_code']; return $this->translateHTML($this->translator, $content, 'doesnt-exist'); }
3. 保留原有错误检测方法
类中的hasError和getErrorMessage方法无需修改,它们直接访问类的$this->status属性,现在catch块修改的就是这个属性,能正确检测到错误状态。
补充说明
如果一定要通过参数传递数组,可使用引用传递(在参数前加&),比如:
protected function translateHTML(object $translator, string $content, string $target_language, array &$status): string { // ... 其余逻辑不变,catch块修改$status['error'] = true ... }
但这种方式不如直接访问$this->status清晰,尤其是在trait场景下,直接使用类的属性更符合面向对象设计。
内容的提问来源于stack exchange,提问作者rguttersohn
相关产品推荐
相关产品推荐

