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」のコメントにも記載されているように、目標の 1 つは、大きなコード セクションを構成することです。特に、ほとんどの IDE には括弧間の行を折りたたむオプションがあるためです。

特に「dragondreamer」の「Luke Mills」の回答を考慮して、少しいじりましたが、これまでのところ、副作用は発生していません。もちろん、これは将来の新しい PHP バージョンで変更される可能性がありますが、「Luke Mills」の回答は、何に注目すべきかについての良い指針を与えてくれます。

4

4 に答える 4

33

はい。ただし、新しいローカル スコープは作成されません。それは通常行われるものではありません。通常、人々はこのようにブロックにコメントを付けます。

アップデート:

マニュアルでそれへの参照を見つけるのに少し掘り下げましたが、ここにあります:

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

PHP スクリプトは、一連のステートメントから構築されます。ステートメントは、代入、関数呼び出し、ループ、条件付きステートメント、または何もしないステートメント (空のステートメント) の場合があります。通常、ステートメントはセミコロンで終わります。さらに、ステートメントのグループを中括弧でカプセル化することにより、ステートメントをステートメント グループにグループ化できます。ステートメント グループは、それ自体がステートメントでもあります。この章では、さまざまなステートメント タイプについて説明します。

ここで重要なのは、ステートメントのグループを中括弧でカプセル化することにより、ステートメントをステートメント グループにグループ化できることです。

この状況に関連する変数スコープへの参照も探しましたが、マニュアルでは特に言及されていませんが、次のように考えることができます。

PHP では、関数とクラスが変数スコープを作成します。あなたはそれについてここで読むことができます. しかし、ステートメントグループ (上記のように) はそうではありません。ifステートメント グループの中括弧を関数 (またはクラス) のラップ ブラケットのように考えないでください。制御構造 ( 、forwhileswitchなど)のステートメント グループをラップする中括弧のように考えてください。それがまさに彼らです。if中かっこが新しいスコープを導入しないステートメント (またはその他の制御構造) を使用している場合、それらは単にステートメントのブロックのラッパーであることは明らかです。

于 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

私が取り組んでいる 1 つのプロジェクトでは、ステートメント グループを使用して構造を示します。私の場合、ノード間の親子関係はルーターで作成されます。

$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 に答える