从被叫方返回(终止)来电者功能

时间:2012-03-13 19:32:46

标签: php

我想创建一个终止调用函数的转发函数。 目前我在callee函数中使用“exit”来实现这一点。

function caller (){
    if($condition){
        forward();
    }
    //code that is not executet if $condition is true
}

//current solution
function forward(){
    //do something
    exit;
}

我想在调用forward-function之后省略return语句。

我猜除了抛出异常之外别无他法?

感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

有几种方法:

1)在if info else分支

之后包含代码

2)如你所说,抛出异常

3)或明白:

function caller (){
    if($condition){
        forward();
        return; // you return nothing (void, in PHP's case that would be NULL, I believe)
    }
    //code that is not executet if $condition is true
}

答案 1 :(得分:2)

抛出异常,使用exit或其他一些讨厌的东西,无论你如何看待它都是过度的(如果你想做的只是条件执行某些代码行)。

解决方案1 ​​

使用else声明。此函数将隐式返回NULL(在PHP中,默认情况下,在退出函数时省略return语句,将NULL返回给调用者。)

function caller (){
    if($condition){
        forward();
    }
    else
    {
        //code that is not executet if $condition is true
    }
}

解决方案2

return语句将退出当前函数。

function caller (){
    if($condition){
        forward();
        return; //this function exits, and no other lines inside this function are executed
    }
    //code that is not executet if $condition is true
}

不要使用exit来终止脚本,不要传递和退出代码。退出就像死了一样,除了输出到php://stdout(与echo一样)它将向OS返回退出代码(exit仅在CLI中有用(命令) ())模式)。

答案 2 :(得分:0)

在“被调用”函数终止之前,您无法终止“调用者”函数。

分配了一堆调用并返回指针问题。

我认为终止函数本身的最佳方法是....只是终止自身。

所以

function caller (){
 if($condition){
    return 0;
 }
//code that is not executet if $condition is true
}

答案 3 :(得分:0)

我在评论中只看到了这个答案,但在其他任何答案中都没有。

总结一下,让我们考虑两种方法以及它们不适合转发功能的原因:

  1. 使用例外;异常不应该用于流控制,它们用于处理异常事件(当操作失败时)。

  2. 使用goto;此语句只能用于在同一执行块中跳转,在这种情况下,它将位于caller内,并且唯一的跳转目标位于函数的末尾。

  3. 使用exit();这将完全终止脚本,并且不会给任何底层代码提供任何其他操作的机会。它通常用于某种致命错误,或者在极少数情况下,您设置一些HTTP标头,然后阻止将更多输出发送到浏览器。

  4. 从技术上讲,前瞻性呼叫基本上应该用来表达“说出他说的话”;并且有一个完美的解决方案:

      

    return forward();

    它将forward()的结果直接传递给调用caller()的代码,同时仍然尊重应用程序的堆栈执行顺序。

答案 4 :(得分:-1)

可能,"转到"是唯一的解决方案:

function post_to_host($url, $data, $cook, $ref, &$resp_head, $type=1)
         {$GLOBALS['POST_TO_HOST.TIME_START']=time();
          ...
          stream_set_timeout($fp, 20);
          fputs($fp, "Accept: */*\r\n"); if (check_timeout()) {goto timeout;}
          fputs($fp, "Accept-Language: *\r\n"); if (check_timeout()) {goto timeout;}
          fputs($fp, "Accept-Encoding: *\r\n"); if (check_timeout()) {goto timeout;}
          while (!feof($fp))
                {$line.=fgets($fp); if (check_timeout()) {goto timeout;}
                }
          return $line;

          timeout:
                  {return 'POST EXCEPTION: Total timeout!';
                  }
         }

function check_timeout()
         {return time()-$GLOBALS['POST_TO_HOST.TIME_START']>60;
         }