2012-03-13 75 views
1

我想创建一个终止调用者函数的转发函数。 目前,我在被调用函数中使用“exit”来实现这一点。从被调用者返回(终止)调用者函数

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

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

我想在调用forward函数后省略return语句。

我猜除了抛出异常外,没有别的办法了吗?

感谢您的帮助。

+0

也许转到?但它真的很丑陋。这是例外情况。 – 2012-03-13 19:35:40

+0

只需让“调用者”知道如何处理“调用者”(定义API和信号机制;例如空结果集)的结果。除非出现“例外”情况,否则从呼叫方退出 - 杀死相当麻烦;否则只能在非常特殊的情况下使用它。 – 2012-03-13 19:36:09

+0

'return forward();' – nickb 2012-03-13 19:36:14

回答

3

有几种方法:

1),其中附有代码之后if资讯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

或者将所有其他代码放在else {}块中,因为如果省略了return; NULL仍隐式返回。 – 2012-06-28 09:46:49

+0

我没有得到那些最近的反对票...就我所见,我的答案没有错,是吗? – 2012-06-29 20:14:42

+3

不,没有错:)我+1了你的 – 2012-06-30 00:45:32

0

在“调用”函数自行终止之前,您不能终止“调用者”函数。

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

我想终止一个函数本身的最好方法是......只是终止自己。

所以

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

可能,“GOTO”是唯一的解决办法:

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; 
     } 
2

抛出异常,使用退出或其他一些讨厌的东西是矫枉过正,不管你如何看待它(如果你想要做的是条件执行一些代码行)。

解决方案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终止脚本,而不通过和退出代码。退出就像die一样,除了不是输出到php://stdout(与echo相同),它将退出代码返回到操作系统(exit仅在CLI(命令行)模式下有效)。

+2

有人正在低调的狂欢和downvoted所有的答案。 – 2012-06-29 10:25:26

+0

想知道如果它与奇怪的赏金:) – 2012-06-30 00:44:47

+1

@jack我怀疑是一样的。另外,当我在这个新问题上提出这个问题时,我正要报告它。我认为对于年龄较大的人而言,积分价值已经缩水,他们没有更好的办法。也许应该取消每个奖励500点,并且应该执行税收来消除一些流通点。 – 2012-06-30 00:49:51

0

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

包裹起来,让我们考虑两种方法,为什么他们不适合转发功能:

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

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

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

从技术上讲,应该基本上用前向呼叫来表达“说出他所说的任何话”;而且也应该是一个完美的解决方案:

return forward();

它直接提供了forward()结果到调用caller()同时仍然尊重您的应用程序的堆栈执行顺序的代码。

+0

第二个是可以接受的答案 – diyism 2012-07-04 06:04:41