57

PHP のショートカットは、本当に知りたいのに、まったくわからないものです。

私は現在、foreach内部に単一のステートメントを含むループを含む関数をコーディングしています。if/else 制御構造でできるように、中括弧を省略しようとしましたが、機能します。エラーなし。

foreach($var as $value)
    $arr[] = $value;

今、同じように使用しようとしましたが、内部に if/else ブロックを入れました。繰り返しますが、動作しており、エラーはありません。

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

それで、「なんでこれが効いているの?」と思いました。終了セミコロンを省略しました。まだ働いている。そのため、foreach ループ内で中括弧を使用せずに if/else ステートメントを使用しようとしましたが、それでも動作し、エラーは発生しませんでした。しかし、foreach ループは今、本当にクローズ/終了していますか?

foreach($var as $value)
    if(1 + 1 == 2)
        $arr[] = $value;

少なくとも、最後のセミコロンをもう一度省略したところ、(予想どおり) 解析エラーが発生しました。

だから私の大きな質問は、いつ中括弧を省略でき、どの構造/ループ/関数で省略できるのですか? ifと で間違いなくできることを知っていelseます。しかしwhileforとはforeachどうでしょうか。

そして、はい、中括弧なしでコード化することは安全でもスマートでもなく、$condition ? true : false;and if: doSomething(); endif;endfor;andのような省略形があることを私は知っていますendforeach;。略記については知りたくありません。いつ、どこで中括弧を省略できるかについての条件を理解したいだけです。

4

12 に答える 12

92

中括弧を省略すると、次のステートメントのみが条件の本体として扱われます。

if ($x) echo 'foo';

と同じです

if ($x) { echo 'foo'; }

しかし、それを覚えておいてください

if ($x)
  echo 'foo';
  echo 'bar';

常に「バー」を出力します

内部的には逆ifです。次の式のみを調べますが、PHP はすべてを{}単一の「グループ化された」式として扱います。

他の制御ステートメント (foreachなど)についても同様です。

于 2012-01-04T11:48:23.543 に答える
33

できる場所もありますが、決してすべきではありません。

明示的は常に暗黙的よりも優れています。

いつ戻って古いコードを変更しなければならないかは誰にもわかりません。そういうものを見逃すのはとても簡単で、それをしても何の得にもなりません。

于 2012-01-04T11:51:30.807 に答える
17

内部に引数が 1 つしかない場合でも問題なく動作します。ただし、中括弧を省略したい場合は、コロンと終了を使用できます。例:

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;
于 2012-01-04T12:46:37.820 に答える
10

速記について学びたくないと言ったように、受け入れられた答えは省略についての良い例を示してcurly bracesいますが、追加するものがあります。ご覧のとおり、 のcurly braces場合は省略しても問題ありませんif ($x) echo 'foo';。コードに問題はなく、パフォーマンスやその他の問題はなく、他の開発者が読むことができます。また、例は、次のように書く場合も示しています

if ($x)
    echo 'foo';
    echo 'bar';

それ以外の

if ($x)
    echo 'foo';

echo 'bar';

印刷されたくないときに が印刷された場所で望ましくない結果に遭遇する可能性がbarあります。コードがそのようなステートメントでいっぱいの場合、自分のコードを読むのが難しくなり、他の人がそれを読むのがさらに難しくなります。 .

速記については知りたくありません。いつ、どこで中括弧を省略できるかについての条件を理解したいだけです。

これらのことは密接に関連しているため、中括弧を省略できる場所を本当に理解したい場合は、それを理解しているか、少なくとも省略形を認識している必要があります。

  1. PHP 制御構造
  2. PHP の三項条件演算子と式の一般的な説明

だから私の大きな質問は、いつ中括弧を省略でき、どの構造/ループ/関数で省略できるのですか?

中括弧は必須ではありませんが、読みやすさとメンテナンスのために、多くの開発者は中括弧を含めないのは悪いスタイルだと考えています。前の 2 つのリンクは、中括弧を省略できる場合に独自の決定を下すために必要な情報を提供するはずです。たとえば、すべてまったく同じことを行う次のコード スニペットに問題はありません。

中括弧付き

if (PHP_VERSION_ID < 70000)
{
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
}

と同じ

if (PHP_VERSION_ID < 70000) :
    print "PHP >= 7.0 required yours is ";
    print phpversion();
    print "\n";
    exit(1);
endif;

または、ドット演算子を使用できます

if (PHP_VERSION_ID < 80000)
    (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

また、三項条件演算子を利用して、if中括弧を省略する以外にそれ自体を省略することもできます

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n") . exit(1);

印刷するだけなので、それを短くして、print string functions中括弧なしのステートメントで複数の関数を表すためにここにあったものを取り除くことができます

(PHP_VERSION_ID > 70000) ?: (print "PHP >= 7.0 required yours is " . phpversion() . "\n") . exit(1);

PHP 7以降、Null合体演算子を使用できます

(PHP_VERSION_ID > 70000) ?: null ?? (print "PHP >= 7.0 required yours is ".phpversion() . "\n") . exit(1);

ご覧のとおり、まったく同じ結果を得る方法はたくさんあります。これはこのif例だけに当てはまるのではなく、 で同じことを実践できますstructure/loop/function。したがって、あなたの大きな質問に対する答えは 1 つではありません。主に次のことを考慮する必要があります。

  1. あなたが書いているコードは保守が簡単ですか。
  2. 中括弧を省略することで得られるものはありますか?
于 2016-01-25T20:04:50.980 に答える
3

次のような単純なことに使用できます。

if($a === true) continue;

しかし、いくつかのより複雑なサブ条件では、問題が発生する可能性があります。

    $a = false;
    $b = false;
    if ($a === true)
        if ($b === true)
            echo 1;
    else
        echo 2;

上記のコードでは、出力として "2" が表示されると予想されますが、そうではありません。

于 2015-05-21T08:03:12.087 に答える
3

PHP テンプレートでは中括弧を省略しています。たとえば、次のようにループを使用できます。

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>
于 2012-01-04T11:51:26.660 に答える
2

@Markoの回答を補完するために、この問題にドット演算子を使用する場合は、各操作を括弧で囲む必要があることに注意してください。そうしないと、順序が逆になります。

たとえば、次のコードはPHP >= 7.0 required yours is 5.6.15.

(print "PHP >= 7.0 required yours is ") . (print phpversion()) . (print "\n");

これは印刷されますが、5.6.151PHP >= 7.0 required yours is 1.

print("PHP >= 7.0 required yours is ") . print(phpversion()) . print("\n");

andこれを機能させるために演算子を使用することもできます。そのようです:

if (PHP_VERSION_ID < 70000)
    print("PHP >= 7.0 required yours is ") and
    print(phpversion()) and
    print("\n");
于 2016-07-31T18:02:22.677 に答える
1

1 行ステートメントの場合。

しようとしたら

foreach($array as $x => $y)
    $do_something = $x;
    $do_something_else = $y;

私が間違っていない限り、php インタープリターは foreach ステートメントの下の 2 行目を暗黙の中かっこの外にあるものとして解釈します。

後でこのコードに戻った場合、または別の開発者があなたの作業を見た場合、インデントが原因で混乱する可能性があります。

そのため、これらのステートメントでは常に中括弧を使用することが一般的に賢明です。後で頭痛/混乱を避けることができます

于 2012-01-04T11:49:12.887 に答える
0

答えは簡単です。これは C/C++ でも同じです。

if、if/else、if/else if/else とループ => 次のステートメントが 1 行の場合は、中かっこを省略できます。

元:

for($i= 0; $i<=100; $i++)
{
    if($i % 7 == 0)
    {   
        echo $i . "<br>";
    }

}

次のように書くこともできます。

for($i= 0; $i<=100; $i++) if($i % 7 == 0) echo $i . "<br>";
于 2015-04-21T10:46:30.747 に答える
0

句の後に式が1つしかない場合に可能です/

例えば、

foreach($var as $value)
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

は正しいが、

foreach($var as $value)
    $somevar = $var;
    if(1 + 1 == 2) {
        $arr[] = $value;
    };

そうではなく、php インタープリターはifステートメントが外部にあると判断します。foreach

于 2012-01-04T11:48:13.387 に答える