PHP中的花括号语法?
我刚刚在浏览PHP文档时发现了这一点,它位于PHP中的花括号语法?,php,Php,我刚刚在浏览PHP文档时发现了这一点,它位于goto的注释中: 我的问题是,为什么这样做 testing: { process: { die('Called'); } } // Displays 'Called'. goto process; // Doesn't work, syntax error goto testing.process; 这个语法叫什么,在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