有没有什么方法可以打破 PHP 中的 if 语句?

PHP 中是否有命令停止执行当前或父 if语句,对于 switch/loop,与 breakbreak(1)相同。比如说

$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 可以是一个代码气味,以及如何通过编写易于管理的小函数来避免这些问题。

206114 次浏览

没有。

但是这样如何:

$a="test";
if("test"==$a)
{
if ($someOtherCondition)
{
echo "yes";
}
}
echo "finish";

将代码封装在函数中。可以随时停止使用 return执行函数。

只需将不应该执行的代码移动到 else/elseif分支。我不明白你为什么要这么做。

$a="test";
if("test"!=$a)
{
echo "yes";
}
else
{
echo "finish";
}

有时,开发这些“花哨”的东西是必需的。如果我们可以打破一个 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是一种替代方法,坏处是你总是需要定义标签(点目标)。

正确的做法:

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();
}

您还可以将进程返回值保存在变量中,然后检查哪个进程失败了。

不,没有办法像在循环中那样“破解”if 块
所以把你的测试变成 switch

我想知道为什么没有人鼓励您使用 开关语句,因为 (即使您没有很多测试用例)
你觉得太冗长了吗?

我一定会在这里争取

  switch($a){
case 'test':
# do stuff here ...
if(/* Reason why you may break */){
break; # this will prevent executing "echo 'yes';" statement
}
echo 'yes';  # ...
break; # As one may already know, we might always have to break at the end of case to prevent executing following cases instructions.
# default:
# something else here  ..
# break;
}

对我来说,异常意味着产生错误,而不是真正控制执行缺陷。
如果您试图设置的中断行为与意外错误无关,则异常处理不是此处 :/的正确解决方案。

$a = 1;


switch($a) {


case "1":


if  ($condition1){
break;
}


if  ($condition2){
break;
}


if  ($condition3){
break;
}
}

这样我就得到了我想要的。我使用一个开关只有一个确定的情况下,然后使用中断的情况下选择如果条件。我使用中断的原因是: 條 tion1和條 tion2都可以满足,在这种情况下只应用條 tion1。IF 是按顺序选择的。

简单的解决方案是把它注释掉。

$a="test";
if("test"==$a)
{


//echo "yes"; //no longer needed - 7/7/2014 - updateded bla bla to do foo
}

额外的好处是你不改变你的原始代码,你可以把它的日期,初始化它,并把原因。

你可以使用 do-while (false) :

    <?php
do if ($foo)
{
// Do something first...


// Shall we continue with this block, or exit now?
if ($abort_if_block) break;


// Continue doing something...


} while (false);
?>

http://php.net/manual/en/control-structures.if.php#90073所述

简单的答案是否定的,在不完全停止执行(通过 exit)的情况下,没有办法从 if语句中断。其他的解决方案对我来说不起作用,因为我不能改变 if语句的结构,因为我要向插件中注入代码,就像这样:

if ( condition ) {
// Code and variables I want to use


// Code I have control over


// Code I don't want to run
}
// More code I want to use

回答你的问题,这是否可以实现,那么是的,这是可以实现的使用“ goto”运算符的 php。

但从伦理上讲,使用“ goto”并不是一个好的做法,因为没有必要使用 goto,这意味着需要重新构建代码,以便可以删除 goto 的要求。

根据您上面发布的示例代码,可以清楚地看到,代码可以重建,不再需要的代码可以删除或注释(如果有可能在未来使用)。

使用三元运算符怎么样?

<?php
// Example usage for: Ternary Operator
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];
?>

它与这个 if/else 语句相同:

<?php
if (empty($_POST['action'])) {
$action = 'default';
} else {
$action = $_POST['action'];
}
?>
$arr=array('test','go for it');
$a='test';
foreach($arr as $val){
$output = 'test';
if($val === $a) $output = "";
echo $output;
}
echo "finish";

结合你的陈述,我想这会给你你想要的结果。 简洁明了,没有太多的陈述。

对于丑陋和好看的代码,我的建议是:

function myfunction(){
if( !process_x() || !process_y() || !process_z()) {
clean_all_processes();
return;
}
/*do all the stuff you need to do*/
}

在你的正常代码的某个地方

myfunction();

我有一个简单的解决方案,没有很多变化。 最初的陈述是

我想中断上面的 if 语句并停止执行 echo“ yes”; 或者不再需要执行的这些代码,可能有也可能没有附加条件,有办法做到这一点吗?

看起来很简单,试试这样的代码。

$a="test";
if("test"==$a)
{
if (1==0){
echo "yes"; // this line while never be executed.
// and can be reexecuted simply by changing if (1==0) to if (1==1)
}
}
echo "finish";

如果你想不用这个代码试试,很简单。你想什么时候回来就什么时候回来。另一种解决方案是注释块。 或者只是简单的思考和尝试,在另一个分离的代码和复制粘贴结果只在您的最终代码。 如果不再需要代码,在您的情况下,结果可能是

$a="test";
echo "finish";

有了这个代码,原来的声明是完全尊重. . :) 而且更易读!

因为您可以在 do/while 循环中使用 休息,所以让我们使用“ ”一轮。在 而(假)结尾处,条件永远不会为真,也不会重复。

do
{
$subjectText = trim(filter_input(INPUT_POST, 'subject'));
if(!$subjectText)
{
$smallInfo = 'Please give a subject.';
break;
}


$messageText = trim(filter_input(INPUT_POST, 'message'));
if(!$messageText)
{
$smallInfo = 'Please supply a message.';
break;
}
} while(false);

要完全停止运行脚本的其余部分,只需执行

//代替中断。代码的其余部分将不执行

有命令: goto

if(smth) {
.....
.....
.....
.....
.....
goto My123;
.....
.....




}






My123:
....your code here....

但是请记住! goto不应该在现实世界脚本的任何地方使用,因为它是代码差的标志。

我参加晚会迟到了,但是我想为晚会做点贡献。我很惊讶竟然没人推荐 exit()。可以用来测试。我一直都在用,而且很有效。

$a ='';
$b ='';
if($a == $b){
echo 'Clark Kent is Superman';
exit();
echo 'Clark Kent was never Superman';
}

代码将在 exit()停止,之后的所有代码都不会运行。

结果

Clark Kent is Superman

它与 foreach()while()也工作。它工作的任何地方,你把它真的。

foreach($arr as $val)
{
exit();
echo "test";
}


echo "finish";

结果

nothing gets printed here.

forloop()一起使用

for ($x = 2; $x < 12; $x++) {
echo "Gru has $x minions <br>";
if($x == 4){
exit();
}
}

结果

Gru has 2 minions
Gru has 3 minions
Gru has 4 minions

在正常情况下

$a ='Make hot chocolate great again!';
echo $a;
exit();
$b = 'I eat chocolate and make Charlie at the Factory pay for it.';

结果

Make hot chocolate great again!

我也有同样的问题,解决办法就是。 第一个例子很简单,但是..。

    $a="test";
if("test"==$a)
{
do something
//break; We remove from your example
if(comparison) {
echo "yes";
}
}
echo "finish";

或者,您可以使用 Goto

    $a="test";
if("test"==$a)
{
do something
goto the_end_of_your_func;
echo "yes";
}
the_end_of_your_func:
echo "finish";