【问题标题】:Use curly brackets to structure code in PHP在 PHP 中使用花括号来构造代码
【发布时间】:2013-02-04 22:32:15
【问题描述】:

是否可以将 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”的回答很好地指出了需要注意的事项。

【问题讨论】:

  • 你的意思是,没有像if(true) { ... }这样的东西?目的是什么?
  • 我真的很想看到这个实现一种方法,让我们通过包装部分代码来管理垃圾收集,一旦完成段/语句就可以安全地收集这些代码。
  • 当您拥有大量代码并且滚动变得麻烦时,当您拥有一个允许您“折叠”块的编辑器时,它确实很有帮助,从而更容易专注于您的代码大约现在

标签: php curly-braces


【解决方案1】:

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

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

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

<?php
const x = 5;
echo x;

但以下将无法编译:

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

【讨论】:

    【解决方案2】:

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

    $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】:

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

      我解决了这个问题:

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

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

      【讨论】:

        【解决方案4】:

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

        更新:

        费了一番功夫才在手册中找到对它的引用,但这里是:

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

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

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

        我还参考了variable scope,因为它与这种情况有关,但手册没有具体提及,但是您可以这样想:

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

        【讨论】:

        • 是的,我想不出一个很好的理由来做这件事。如果它在功能上不需要{}(如控制结构、函数等),那么这样做似乎很愚蠢和令人困惑。
        • @prodigitalson: 原因:我必须使用带有本机设置 (notepad++) 的代码编辑器,它只能折叠注释块 (/ /) 和功能块 ({} )。
        • @Stackoverflow2000:所有的原因——“所以我可以在我的编辑器中折叠代码”——必须是最糟糕的......
        • @prodigitalson,好吧,我不使用代码折叠,是的,我想这是一个“不好的理由”。但是,如果您需要它并且无法选择您的编辑器,那么有一个替代方案很重要。 (PS. 只要您不主动提出为我做我的工作,请不要以适用于您个人工作的标准来判断我的理由)
        • FWIW 我自己刚刚尝试过(在到达这里之前),因为我认为解决 /* */ 样式 cmets 无法嵌套的问题可能很有用。使用花括号,我可以定义一段代码并在顶部添加注释。所有 IDE 都可以让您找到给定大括号的对,从而可以轻松找到注释不再适用的位置,而不是无用的 /* ENDS */ 或类似的嵌套注释块更难解析。出于这个原因,对我来说似乎很有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 2020-05-28
        • 2015-12-19
        相关资源
        最近更新 更多