PHP中的花括号语法?

PHP中的花括号语法?,php,Php,我刚刚在浏览PHP文档时发现了这一点,它位于goto的注释中: 我的问题是,为什么这样做 testing: { process: { die('Called'); } } // Displays 'Called'. goto process; // Doesn't work, syntax error goto testing.process; 这个语法叫什么,在PHP开发中使用过吗 我似乎找不到任何关于这种语法的文档,也找不到任何示例 任何关于这个主题的知

我刚刚在浏览PHP文档时发现了这一点,它位于
goto
的注释中:

我的问题是,为什么这样做

testing: {
    process: {
        die('Called');
    }
}

// Displays 'Called'.
goto process;

// Doesn't work, syntax error
goto testing.process;
这个语法叫什么,在PHP开发中使用过吗

我似乎找不到任何关于这种语法的文档,也找不到任何示例


任何关于这个主题的知识都将不胜感激

这是一个简单的
goto

我有时在一些边缘情况下使用它(通常是为了避免嵌套的
if/else

但它必须非常小心地使用

我只使用它来设置脚本的结尾,通常是一个简单的
返回

永远不要用它来做复杂的事情,否则你的代码会很快变得凌乱

以下是PHP文档中的参考:

这是一个具体的实现,其中必须使用
goto
,以使代码可读且干净:

/**
 * @param \Exception $e
 *
 * @return bool|string Returns false in "production" if something goes wrong.
 *                     May return "retry" if rate limit is reached
 *
 * @throws ApiConnection  Only in dev and test environments
 * @throws Authentication Only in dev and test environments
 * @throws Card           Only in dev and test environments
 * @throws InvalidRequest Only in dev and test environments
 * @throws RateLimit      Only in dev and test environments
 */
private function handleException(\Exception $e)
{
    // If we received a rate limit exception, we have to retry with an exponential backoff
    if ($e instanceof RateLimit) {
        // If the maximum number of retries is already reached
        if ($this->retries >= $this->maxRetries) {
            goto raise;
        }

        // First, put the script on sleep
        sleep($this->wait);

        // Then we have to increment the sleep time
        $this->wait += $this->wait;

        // Increment by 1 the number of retries
        ++$this->retries;

        return 'retry';
    } elseif ($e instanceof Card) {
        if ('dev' === $this->environment || 'test' === $this->environment) {
            throw $e;
        }

        return false;
    }

    // \Stripe\Error\Authentication, \Stripe\Error\InvalidRequest and \Stripe\Error\ApiConnection are raised immediately
    raise:
    $body = $e->getJsonBody();
    $err = $body['error'];
    $message = '[' . $e->getHttpStatus() . ' - ' . $e->getJsonBody()['error']['type'] . '] ' . $e->getMessage();
    $context = [
        'status' => $e->getHttpStatus(),
        'type' => isset($err['type']) ? $err['type'] : '',
        'code' => isset($err['code']) ? $err['code'] : '',
        'param' => isset($err['param']) ? $err['param'] : '',
        'request_id' => $e->getRequestId(),
        'stripe_version' => $e->getHttpHeaders()['Stripe-Version']
    ];

    if (null === $this->logger) {
        $this->logger->error($message, $context);
    }

    if ('dev' === $this->environment || 'test' === $this->environment) {
        throw $e;
    }

    return false;
}
此代码管理Stripe SDK引发异常的情况

如您所见,如果达到最大重试次数,代码将直接“跳转”到
raise
标记

这是我为Symfony准备的包。它的完整代码是可用的。

在文档中,
目标:
语法没有任何调用,它只是表示一个
转到
可以跳转到的目标

大括号本身并不表示任何东西,只是其中的代码属于该目标。与中一样,大括号只会使目标语法更清晰

目标只与goto有关。目标不是(也不能)变量,也不是对象

PHP中的
语法是一个字符串连接运算符,因为
测试
过程
目标不是字符串,它会抛出一个错误,说明
是意外的

因为它们不是对象,所以您也不能
goto testing->process由于
测试
不拥有
流程
测试
只是一个目标,其中包含另一个
流程
目标。您可以调用goto testing和调用的
仍将被输出


正如其他人所说,请不要使用
goto
。PHP中的大括号仅用于将语句分组到块中,可以在需要单个语句的地方使用。例如,当
if
while
的主体是多个语句时,需要使用大括号对它们进行分组

除此之外,它们是完全可选的,对代码的运行方式没有影响。但是编辑器会将代码缩进大括号中,因此它可以用于自文档目的,以便同时显示相关语句

这就是为什么在您引用的示例中使用它们。正如正文所说:

如果你不是一个野生标签的粉丝,你可以自由地使用大括号来创建一个稍微干净的外观

这是他使用它们的唯一目的,这只是他的个人风格


这不是一个常见的习惯用法(
goto
通常不常见,所以很少需要语句标签),我也不知道它有什么特别的名称。

有点难找到:它们只是被称为“语句组”。我已经用PHP开发了将近4年了,从来没有发现过一个这样做有意义的用例……希望这能充分回答您的第二个问题:它的最佳用途可能是在PHP控制台脚本中。似乎嵌套结构没有按照您调用它们时所期望的方式工作。您好,史蒂夫,我已经用一个具体的例子更新了我的答案,说明了
goto
操作符的有用性。我希望它能帮助您更好地理解它的用例。其他答案没有错,但这个答案与我的代码示例一起完美地解释了一切。谢谢@alec gordon:D