为什么PHP会出现“无法中断/继续1级”错误?

23

我有时在生产环境中会遇到这个错误:

if( true == $objWebsite ) {
    $arrobjProperties = (array) $objWebsite->fetchProperties( );
    if( false == array_key_exists( $Id, $Properties ) ) {
       break;
    }
    $strBaseName = $strPortalSuffix . '/';

    return $strBaseName;
}

$strBaseName = $strSuffix ;
return $strBaseName;

我试图重现这个问题,但没有任何进展。已经收到了 $Id 和 $Properties 的值。

有人知道在 PHP 中什么时候会出现“无法中断 / 继续 1 级”的错误吗?

我看过这篇帖子 PHP Fatal error: Cannot break/continue,但没有得到任何帮助。


2
在那种情况下,你认为“break”会如何表现? - Andreas Wong
2
什么是周围的代码?break只有在循环或开关的上下文中才有用。 - Michael Berkowski
当在循环外使用break或continue时会出现这种情况。这是我见过的唯一原因。 - Tchoupi
在这种情况下,array_key_exists 中的 falsefalse 将松散匹配。小心使用松散检查。http://php.net/manual/en/language.operators.comparison.php - MetalFrog
@SiGanteng:这部分属于函数。它在某些情况下可以工作,但在某些情况下会出错。所以我需要修改if条件,对吗? - Somnath Muluk
将“break”更改为“return”,你就可以了。 - Andreas Wong
3个回答

35

在if语句中你无法使用“break”关键字跳出循环,只能在循环中使用它。

如果你想要在调用函数中使用它来跳出循环,你需要通过返回值或抛出异常来处理。


返回值方法:

while (MyLoop) {
   $strSecureBaseName = mySubFunction();
   if ($strSecureBaseName === false) {   // Note the triple equals sign.
        break;
   }
   // Use $strSecureBaseName;
}

// Function mySubFunction() returns the name, or false if not found.

使用异常 - 这里有一个很好的例子:http://php.net/manual/zh/language.exceptions.php

<?php
function inverse($x) {
    if (!$x) {
        throw new \Exception('Division by zero.');
    } else {
        return 1/$x;
    }
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (\Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo 'Hello World';
?>

2

如果在函数中,只需将break;更改为return;


2
为什么要返回?如果在“if”之后没有要执行的语句,则可以返回。但是,如果需要执行一些语句,则不应该返回。 - Somnath Muluk
1
在那种情况下我同意。这也取决于代码块试图应用的逻辑。是的,所以并不总是返回。 - SudarP

1
如果你仍然想要从if语句中退出,你可以使用while(true)。
例如:
$count = 0;
if($a==$b){
    while(true){
        if($b==$c){
            $count = $count + 3;
            break;  // By this break you will be going out of while loop and execute remaining code of $count++.
        }
        $count = $count + 5;  //
        break;  
    }
    $count++;
}

同时你可以使用 switch 和 default。

$count = 0;
if($a==$b){
    switch(true){
      default:  
         if($b==$c){
            $count = $count + 3;
            break;  // By this break you will be going out of switch and execute remaining code of $count++.  
        }
        $count = $count + 5;  //
    }
    $count++;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接