在PHP中有没有什么命令可以停止执行当前或父if
语句,就像break
或break(1)
中的switch
/loop
一样。例如
$arr=array('a','b');
foreach($arr as $val)
{
break;
echo "test";
}
echo "finish";
在上面的代码中,PHP不会执行echo "test";
,而是转到echo "finish";
我需要这个如果
$a="test";
if("test"==$a)
{
break;
echo "yes"; // I don't want this line or lines after to be executed, without using another if
}
echo "finish";
我想要break
上面的if
语句,并停止执行echo "yes";
或这样的代码,这些代码不再需要执行,可能有也可能没有附加条件,有没有办法这样做?
更新:在发布这个问题仅仅两年后,我长大了,我学会了如何以小块的形式编写代码,为什么嵌套的if可能是一种代码气味,以及如何通过编写可管理的小函数来避免此类问题。
发布于 2011-11-15 09:30:34
不要担心其他用户的评论,我可以理解你,有时在开发这种“花哨”的东西时都需要。如果我们能打破一个if,那么很多嵌套的If就不再是必要的了,这使得代码更加整洁和美观。
这个示例代码演示了,在某些情况下,被破坏的if可能比许多丑陋的嵌套if更合适……如果你没有面对过这种情况,并不意味着它不存在。
丑陋的代码
if(process_x()) {
/* do a lot of other things */
if(process_y()) {
/* do a lot of other things */
if(process_z()) {
/* do a lot of other things */
/* SUCCESS */
}
else {
clean_all_processes();
}
}
else {
clean_all_processes();
}
}
else {
clean_all_processes();
}
好看的代码
do {
if( !process_x() )
{ clean_all_processes(); break; }
/* do a lot of other things */
if( !process_y() )
{ clean_all_processes(); break; }
/* do a lot of other things */
if( !process_z() )
{ clean_all_processes(); break; }
/* do a lot of other things */
/* SUCCESS */
} while (0);
正如@NiematojakTomasz所说的那样,使用goto
是一种替代方案,不好的是你总是需要定义标签(点目标)。
发布于 2011-09-19 17:31:38
将你的代码封装在一个函数中。您可以随时停止使用return
执行函数。
发布于 2014-01-08 06:18:54
正确的方法是:
try{
if( !process_x() ){
throw new Exception('process_x failed');
}
/* do a lot of other things */
if( !process_y() ){
throw new Exception('process_y failed');
}
/* do a lot of other things */
if( !process_z() ){
throw new Exception('process_z failed');
}
/* do a lot of other things */
/* SUCCESS */
}catch(Exception $ex){
clean_all_processes();
}
在阅读了一些评论后,我意识到异常处理对于正常的流控制并不总是有意义的。对于正常的控制流,最好使用"If else":
try{
if( process_x() && process_y() && process_z() ) {
// all processes successful
// do something
} else {
//one of the processes failed
clean_all_processes();
}
}catch(Exception ex){
// one of the processes raised an exception
clean_all_processes();
}
您还可以将进程返回值保存在变量中,然后检查进程失败的失败/异常块。
https://stackoverflow.com/questions/7468836
复制相似问题