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

Alb*_*bin 19 php curly-brackets

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

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

例如,这将是:

<?php

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

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

?>
Run Code Online (Sandbox Code Playgroud)

始终表现得与此相同:

<?php

// First Code-Block
# several lines of code

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

?>
Run Code Online (Sandbox Code Playgroud)

Luk*_*lls 29

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

更新:

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

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

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

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

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

在PHP中,函数和类创建一个变量范围.你可以在这里阅读.但声明组(如上所述)却没有.不要以为一个语句组的功能等(或类)包裹支架的花括号,但认为他们喜欢的花括号是包裹语句组控制结构(if,for,while,switch,等) -因这正是它们的本质.很明显,如果你使用一个if语句(或任何其他控制结构),大括号不会引入新的作用域,它们只是一个语句块的包装器.

  • @prodigitalson,嗯,我不使用代码colapsing,是的,我认为这是一个"坏理由".但如果你需要它并且不能选择你的编辑器那么重要的是要有一个改变.(PS.只要您不提供我的工作,请不要通过适用于您**个人工作的标准来判断我的理由) (6认同)
  • @ Stackoverflow2000:所有原因 - "所以我可以在我的编辑器中获得代码折叠" - 必须是最糟糕的...... (5认同)
  • @prodigitalson:原因:我必须使用具有本机设置的代码编辑器(notepad ++),它只会缩短注释块(*//*)和功能块({}). (2认同)
  • FWIW我自己尝试过(在到达此处之前),因为我认为解决/*\*/style注释无法嵌套的问题可能有用.使用花括号我可以定义一个代码块并在顶部放置注释.所有的IDE都可以让你找到一个给定大括号的对,这样就可以很容易地找到注释不再适用的地方,而不是无用的/*ENDS*/或类似的,这对于使用嵌套的注释块更难解析.因为这个原因,似乎对我有用. (2认同)

dra*_*mer 7

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

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

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

<?php
const x = 5;
echo x;
Run Code Online (Sandbox Code Playgroud)

但以下内容不会编译:

<?php
{
  const x = 5;
  echo x;
}
Run Code Online (Sandbox Code Playgroud)


min*_*.dk 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');
    }
}
Run Code Online (Sandbox Code Playgroud)

``

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

/admin
  /upload
  /menu
    /load
    /save
Run Code Online (Sandbox Code Playgroud)

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

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

/admin
  /upload
  /menu
    /load
    /save
Run Code Online (Sandbox Code Playgroud)

我认为,这种情况下的缩进确实阐明了正在发生的事情。