【发布时间】:2015-06-23 12:11:36
【问题描述】:
我在 yii 中有如下代码。
<?php
class MediaController extends Controller {
public $mail_try = 1;
public function actionUpdate()
{
// ........... Other Code
$return_err = array();
/* Now Send Email */
if(sizeof($mail_queue)>0)
{
foreach($mail_queue as $resmail)
{
$this->mail_try = 1;
$to_arr = $resmail['to_arr'];
$cc_arr = $resmail['cc_arr'];
$from = $resmail['from'];
$subject = $resmail['subject'];
$message = $resmail['message'];
$log_msg = $resmail['log_msg'];
$attachment = $resmail['attachment'];
$log = $resmail['log'];
$output = $this->mailsend($to_arr, $cc_arr, $from, $subject, $message, 'Image/Media update (action : insert) ', $attachment,$log);
if($output==0)
{
$return_err[] = $resmail['vendor_name'];
}
}
}
}
public function mailsend($to, $cc, $from, $subject, $message, $crontask, $attachment = array(),$log='') {
//....... Other Code
//....... Other Code
try{
if (!$mail->Send()) {
if($this->mail_try < 3)
{
$this->mail_try++;
$this->mailsend($to, $cc, $from, $subject, $message, $crontask,$attachment,$log);
return 0;
}
} else {
return 1;
}
} catch (Exception $ex) {
return 0;
}
}
}
?>
我想要做的是如果邮件发送失败,然后调用相同的函数来重试发送电子邮件。如果电子邮件发送仍然失败,则返回 0,否则返回 1。然后使用此返回值,我试图通知用户有关邮件发送错误的信息。
之前,我认为低于返回值的代码不会执行。但我错了。在上述情况下,它在返回值之后执行,因为它在递归函数中。
那么,如何解决这个问题?
【问题讨论】:
-
说实话,我无法弄清楚你在说什么是你的问题。快速查看代码虽然让我觉得
$this->mailsend(...)行应该是return $this->mailsend(...),删除以下return 0;。最后,从外观上看,有一个路径,当邮件失败两次时将返回 null。 -
这里的问题是,代码在返回值之后还在执行,所以我无法得到预期的返回值。我正在尝试做的是在几次尝试发送电子邮件后返回 1 或 0 值。
-
所以如果我按照你的建议编辑我的代码,它仍然会在返回值之后执行代码。
-
返回后不再继续运行。
return完成当前块的过程,在您的情况下,返回的调用块恰好是将完成运行的相同方法,这就是递归所做的。但是,如果该行在递归调用mailsend时简单地返回,那么它应该级联返回到原始调用,并返回到您的actionUpdate方法,并返回 1 或 0(如果您修复了返回 null 的路径)。跨度> -
您能否用示例代码将其写为答案,对不起,但我无法理解您的意思,“(如果您修复返回 null 的路径)”是什么意思?