我有一个方法可以将HTML翻译成另一种语言。该方法内部是一个try,catch块,用于处理网络错误。我有另一个方法,如果发生错误,则返回true。另一个显示错误消息。
但是,我还没有找到一种方法,让这两种方法都知道翻译失败的时候。
下面是处理实际翻译的方法(它是一个名为Translate的trait的一部分)。$status是一个数组,它是使用此trait的TranslateContent类中的变量。
protected function translateHTML(object $translator, string $content, string $target_language, array $status):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['status'] = true;
$status['message'] = $error->getMessage();
return $content;
}
endif;
return $content;
}
在使用trait Translate的TranslateContent类的顶部,我声明了$status:
protected $status = [
'error' => false,
'message' => ''
];
下面是使用translateHTML()方法的方法,在该方法中抛出异常。我添加的最后一个参数是上面创建的状态数组。(注意:我在这里传递了一个不正确的目标语言来触发异常。
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', $this->status );
}
最后是返回状态方法:
public function hasError():bool{
return $this->status['error'];
}
public function getErrorMessage():string{
return $this->status['message'];
}
我的想法是,如果在转换尝试期间抛出异常,我需要从catch块中更新$status的状态。但$状态未更新。相反,示例化TranslateContent的代码运行时就像根本没有错误一样。
我最初认为这是一个作用域问题,但从我所读到的内容来看,catch块在PHP中没有作用域。
我错过了什么?
2条答案
按热度按时间rqqzpn5f1#
看起来你想要的是通过引用传递
$status
变量。你可以通过重新定义你的
translateHTML
签名前缀&
你的$status
变量:这样,当你“编辑”变量时,你将编辑传递给方法的实际变量(而不是默认的副本)。
上面的应该可以工作,但是也许你可能想把$status属性移到trait本身。这样,您就可以使用
$this->status
访问它,而根本不需要传递它。ctzwtxfj2#
你可以这样声明
$status
:但是你的
catch
块犯了两个错误:您应该更新
$this->status
,并设置$this->status['error']
,如下所示:这样,对
translateHTML()
的调用就不需要传入$status
变量。用于检索错误状态和消息的方法正在正确地访问类属性,因此它们现在应该可以工作了。
不需要通过引用传递
$status
,或者根本不需要。这就是类属性的作用。