我想创建一个终止调用函数的转发函数。 目前我在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语句。
我猜除了抛出异常之外别无他法?
感谢您的帮助。
答案 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)
我在评论中只看到了这个答案,但在其他任何答案中都没有。
总结一下,让我们考虑两种方法以及它们不适合转发功能的原因:
使用例外;异常不应该用于流控制,它们用于处理异常事件(当操作失败时)。
使用goto;此语句只能用于在同一执行块中跳转,在这种情况下,它将位于caller
内,并且唯一的跳转目标位于函数的末尾。
使用exit();这将完全终止脚本,并且不会给任何底层代码提供任何其他操作的机会。它通常用于某种致命错误,或者在极少数情况下,您设置一些HTTP标头,然后阻止将更多输出发送到浏览器。
从技术上讲,前瞻性呼叫基本上应该用来表达“说出他说的话”;并且有一个完美的解决方案:
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;
}