On this page

PHP break / continue / return / declare

break

(PHP 4, PHP 5, PHP 7, PHP 8)

break 结束执行当前的 forforeachwhiledo-whileswitch 结构。

break 接受一个数字的可选参数,决定跳出几重循环。 默认值是 1,仅仅跳出最近一层嵌套结构。


<?php
$arr = array('one', 'two', 'three', 'four', 'stop', 'five');
foreach ($arr as $val) {
    if ($val == 'stop') {
        break;    /* 也可以在这里写 'break 1;'。 */
    }
    echo "$val<br />\n";
}

/* 使用可选参数 */

$i = 0;
while (++$i) {
    switch ($i) {
        case 5:
            echo "At 5<br />\n";
            break 1;  /* 只退出 switch. */
        case 10:
            echo "At 10; quitting<br />\n";
            break 2;  /* 退出 switch 和 while 循环 */
        default:
            break;
    }
}
?>

continue

(PHP 4, PHP 5, PHP 7, PHP 8)

continue 在循环结构用用来跳过本次循环中剩余的代码并在条件求值为真时开始执行下一次循环。

注意:

在 PHP 中 switch 语句被认为是可以使用 continue 的一种循环结构。 continue 的行为类似于没有传递参数的 break ,但会引发警告,因为这可能是一个错误。 如果 switch 在循环内, continue 2 将会外部循环中的下一个迭代中继续。

continue 接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是 1,即跳到当前循环末尾。


<?php
foreach ($arr as $key => $value) {
    if (!($key % 2)) { // 忽略偶数成员
        continue;
    }
    do_something_odd($value);
}

$i = 0;
while ($i++ < 5) {
    echo "Outer<br />\n";
    while (1) {
        echo "Middle<br />\n";
        while (1) {
            echo "Inner<br />\n";
            continue 3;
        }
        echo "This never gets output.<br />\n";
    }
    echo "Neither does this.<br />\n";
}
?>

省略 continue 后面的分号会导致混淆。以下例子示意了不应该这样做。


<?php
  for ($i = 0; $i < 5; ++$i) {
      if ($i == 2)
          continue
      print "$i\n";
  }
?>
希望得到的结果是:
0
1
3
4

declare

(PHP 4, PHP 5, PHP 7, PHP 8)

declare 结构用来设定一段代码的执行指令。declare 的语法和其它流程控制结构相似:

declare (directive)
    statement

directive 部分允许设定 declare 代码段的行为。目前只认识三个指令:ticks(更多信息见下面 ticks 指令)、 encoding(更多信息见下面 encoding 指令)、 strict_types 指令 (更多信息见类型声明页面

 [严格类型](https://www.php.net/manual/zh/language.types.declarations.php#language.types.declarations.strict)

章节)。

 因为本指令是在文件编译时处理的,所以指令只接受字面量的值。
 无法使用变量和常量。下面为你演示:


<?php
// 这样是有效的:
declare(ticks=1);

// 这样是无效的:
const TICK_VALUE = 1;
declare(ticks=TICK_VALUE);
?>

declare 代码段中的 statement 部分将被执行——怎样执行以及执行中有什么副作用出现取决于 directive 中设定的指令。

declare 结构也可用于全局范围,影响到其后的所有代码(但如果有 declare 结构的文件被其它文件包含,则对包含它的父文件不起作用)。


<?php
// 两者相等:

// 可以这样用:
declare(ticks=1) {
    // 这里写完整的脚本
}

// 也可以这样用:
declare(ticks=1);
// 这里写完整的脚本
?>

Ticks

Tick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用 ticks=N 来指定的。

不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。

在每个 tick 中出现的事件是由 register_tick_function() 来指定的。更多细节见下面的例子。注意每个 tick 中可以出现多个事件。

示例 #1 Tick 的用法示例


<?php

declare(ticks=1);

// 每次 tick 事件都会调用该函数
function tick_handler()
{
    echo "tick_handler() called\n";
}

register_tick_function('tick_handler'); // 引起 tick 事件

$a = 1; // 引起 tick 事件

if ($a > 0) {
    $a += 2; // 引起 tick 事件
    print($a); // 引起 tick 事件
}

?>

参见 register_tick_function()unregister_tick_function()

Encoding

可以用 encoding 指令来对每段脚本指定其编码方式。

示例 #2 对脚本指定编码方式


<?php
declare(encoding='ISO-8859-1');
// 在这里写代码
?>

警告

当和命名空间结合起来时 declare 的唯一合法语法是
`declare(encoding='...');`,其中 `...`
是编码的值。而 `declare(encoding='...') {}`
将在与命名空间结合时产生解析错误。

return

(PHP 4, PHP 5, PHP 7, PHP 8)

return 将程序控制返还给调用模块。 将在调用模块中执行的下一句表达式中继续。

如果在一个函数中调用 return 语句,将立即结束此函数的执行并将它的参数作为函数的值返回。return 也会终止 eval() 语句或者脚本文件的执行。

如果在全局范围中调用,则当前脚本文件中止运行。如果当前脚本文件是被 include 的或者 require 的,则控制交回调用文件。此外,如果当前脚本是被 include 的,则 return 的值会被当作 include 调用的返回值。如果在主脚本文件中调用 return,则脚本中止运行。如果当前脚本文件是在 php.ini 中的配置选项 auto_prepend_file 或者 auto_append_file 所指定的,则此脚本文件中止运行。

更多信息见返回值

注意:

注意既然 **return**
是语言结构而不是函数,因此其参数没有必要用括号将其括起来,也不推荐这样用。

注意:

如果没有提供参数,则一定不能用括号,此时返回 **`null`**。如果调用
`return` 时加上了括号却又没有参数会导致解析错误。

自 PHP 7.1.0 起,如果函数中声明的返回类型是 void 而带了返回的参数,将导致 E_COMPILE_ERROR,相反声明了返回类型而未带参数也会同样导致该错误。