23

是否可以将 PHP 中的代码片段括在括号内(不使用片段作为函数)?

以下代码的行为方式是否与没有大括号时的行为方式相同?或者可能有任何问题,具体取决于括号内或括号外使用的代码类型?

例如,这是否会:

<?php

// First Code-Block
{# several lines of code
}

// Second Code-Block
{# another several lines of code
}

?>

始终以与以下相同的方式运行:

<?php

// First Code-Block
# several lines of code

// Second Code-Block
# another several lines of code

?>

更新: 正如“My1”的评论中所述,目标之一是构建大型代码段。特别是因为大多数 IDE 都为您提供了折叠括号之间的行的选项。

特别是考虑到“dragondreamer”的“Luke Mills”的答案,我玩了一下,到目前为止我没有遇到任何副作用。当然,这可能会随着未来的新 PHP 版本而改变,但“Luke Mills”的回答给出了需要注意的很好的指示。

4

4 回答 4

33

是的,但它不会创建新的本地范围。这不是通常会做的事情。通常人们用评论标记这样的块。

更新:

花了一些时间在手册中找到对它的引用,但这里是:

http://www.php.net/manual/en/control-structures.intro.php

任何 PHP 脚本都是由一系列语句构成的。语句可以是赋值、函数调用、循环、条件语句,甚至是什么都不做的语句(空语句)。语句通常以分号结尾。此外,通过用花括号封装一组语句,可以将语句分组为一个语句组。语句组本身也是一个语句。本章描述了各种语句类型。

这里的关键是可以通过用花括号封装一组语句来将语句分组为一个语句组

我还查看了与这种情况有关的变量范围的引用,但手册没有特别提到它,但是你可以这样想:

在 PHP 中,函数和类创建一个变量范围。你可以在这里阅读。但是语句组(如上所述)没有。不要把语句组的花括号想成函数(或类)包裹括号的样子,而要把它们想成包裹控制结构(、、、、、等)的语句组的花if括号——因为他们就是这样。很明显,如果您使用大括号不引入新范围的语句(或任何其他控制结构),它们只是语句块的包装器。forwhileswitchif

于 2013-02-20T02:08:31.783 回答
10

如果将 PHP 代码行为括在大括号中,则它不会改变。但是,您不能在大括号内使用一些 PHP 语句:

  • namespace声明;
  • 命名空间use声明别名或导入任何名称;
  • 全球const声明;
  • __halt_compiler().

这意味着,以下脚本将起作用:

<?php
const x = 5;
echo x;

但以下内容将无法编译:

<?php
{
  const x = 5;
  echo x;
}
于 2016-03-24T13:57:46.323 回答
5

在我正在进行的一个项目中,我使用语句组来指示结构——在我的例子中,节点之间的父/子关系在路由器中创建:

$router = new Router();

$admin = $router->route('admin');
{
    $upload = $admin->route('upload')->post('upload');

    $menu = $admin->route('menu');
    {
        $menu->route('load')->get('load');
        $menu->route('save')->get('save');
    }
}

```

在内部,这构建了一个层次结构,如:

/admin
  /upload
  /menu
    /load
    /save

在这个例子中调用route()创建了一个孩子——所以代码创建了一个模型(在路由器内部),它具有树结构,但代码的结构并没有反映这一点。

我在这里使用花括号使代码更清晰,因为阅读没有花括号和缩进的代码将非常困难:

$router = new Router();

$admin = $router->route('admin');
$upload = $admin->route('upload')->post('upload');
$menu = $admin->route('menu');
$menu->route('load')->get('load');
$menu->route('save')->get('save');

我认为,这种情况下的缩进确实可以澄清正在发生的事情。

于 2015-07-22T08:29:57.007 回答
1

我也这样做,仅仅是因为我的文本编辑器(Komodo Edit 8.5)。如果它可以帮助您并且不会造成任何问题并且没有其他简单的方法可以做到这一点,那么这不是“糟糕的理由”或“糟糕的编码”。

我通过解决方法解决了这个问题:

if(1 == 1){ //always executing if function
//whatever you want to add
}
#

在末尾添加 # 可以防止我的编辑器折叠大括号下方的所有空行。这有助于进一步构建代码。

于 2015-07-05T16:48:29.690 回答