使用大括号在PHP中构造代码

时间:2013-02-20 02:04:46

标签: php curly-brackets

是否可以将代码片段用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

?>

4 个答案:

答案 0 :(得分:27)

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

<强>更新

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

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

  

任何PHP脚本都是由一系列语句构建的。语句可以是赋值,函数调用,循环,条件语句,甚至是不执行任何操作的语句(空语句)。声明通常以分号结尾。此外,通过使用花括号封装一组语句,可以将语句分组到语句组中。声明组本身也是一种声明。本章将介绍各种语句类型。

这里的关键是语句可以通过用花括号括起一组语句来分组到一个语句组中。

我也想看一下variable scope的引用,因为它与这种情况有关,但是手册没有特别提到它,但你可以这样想:

在PHP中,函数和类创建一个变量范围。你可以阅读here。但声明组(如上所述)却没有。不要考虑语句组的大括号,如函数(或类)包装括号,但将它们想象为包装控制结构的语句组的花括号(if,{{1 }},forwhile等) - 因为这正是它们的本质。很明显,如果你使用switch语句(或任何其他控制结构),大括号不会引入新范围,它们只是一个语句块的包装器。

答案 1 :(得分:7)

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

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

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

<?php
const x = 5;
echo x;

但以下内容无法编译:

<?php
{
  const x = 5;
  echo x;
}

答案 2 :(得分:4)

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

$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');

在这种情况下,缩进确实澄清了我发生了什么。

答案 3 :(得分:1)

我也是这样做的,完全是因为我的文本编辑器(Komodo Edit 8.5)。这不是一个错误的原因&#34;或者&#34;糟糕的编码&#34;,如果它对你有所帮助,并且没有引起任何问题,并且没有其他简单的方法可以做到。

我通过解决方法来解决问题:

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

在最后添加一个#会阻止我的编辑器折叠大括号下方的所有空行。这有助于进一步构建代码。