PHP-If / else, for, foreach, while-без фигурных скобок?

что-то, что действительно хотел бы знать, но никогда не узнал, являются ярлыками в PHP.

в настоящее время я кодирую функцию с помощью foreach цикл с одним оператором внутри. Я попытался опустить фигурные скобки, как вы можете сделать в структурах управления if/else, и это работает. Никакая ошибка.

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

теперь я попытался использовать его таким же образом, но положить блок if/else внутри него. Опять же, работает и ошибок нет.

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

затем я подумал: "почему это работает?- и опустил точку с запятой. Все еще работать. Поэтому я попытался использовать оператор if/else без фигурных скобок внутри цикла foreach и снова, все еще работая и без ошибок. Но действительно ли цикл foreach закрыт / завершен прямо сейчас?

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

по крайней мере, я снова опустил точку с запятой закрытия и (как и ожидалось) произошла ошибка синтаксического анализа.

Итак, мой большой вопрос: когда я могу опустить фигурные скобки и в какой структуре/петле/функции? Я знаю, что могу. определенно сделайте это в if и else. Но как насчет while, for и foreach?

и да, я знаю, что это не безопасно, умный, что бы код без фигурных скобок и есть стенографии, как $condition ? true : false; и if: doSomething(); endif;, endfor; и endforeach;. Я не хочу изучать стенографию, я просто хочу понять условия о том, когда и где можно опустить фигурные скобки.

12 ответов


когда вы опустите скобки, он будет рассматривать только следующий оператор как тело условия.

if ($x) echo 'foo';

это то же самое, что

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

но помните, что

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

будет всегда печать "bar"

внутренне это наоборот:if будет смотреть только на следующее выражение, но PHP обрабатывает все в {} как одно "сгруппированное" выражение.

то же самое для других операторов управления (foreach, и так далее)


есть места, где вы можете, но вы никогда не должны.

явный всегда лучше, чем неявное.

кто знает, когда вам придется вернуться назад и изменить старый код. Это так легко пропустить, и нет ничего хорошего, делая это.


Он будет работать нормально, если у вас есть только один аргумент внутри!. Но если вы хотите опустить фигурные скобки, вы можете использовать двоеточие и конец. пример:

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;

как я уже сказал, Вы не хотите узнать о стенографии и принятый ответ дает хороший пример об опущении 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 мы можем использовать нулевое объединение оператор

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

как видно, есть много способов получить точно такой же результат. Это относится не только к этому if пример но то же самое можно практиковать с structure/loop/function. Так что нет никакого ответа для вашего большой вопрос. Следует учитывать в основном следующее.

  1. это код, который вы пишете легко поддерживать.
  2. можете ли вы ответить за себя, есть ли что-то, что вы выигрываете, опуская фигурные фигурные скобки.

Я опускаю фигурные скобки в моих шаблонах PHP. Е. Г. вы можете использовать петли следующим образом:

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>

Вы можете использовать его для простых вещей, таких как:

if($a === true) continue;

но для некоторых более сложных под-условий это может вызвать у вас проблемы:

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

С кодом выше вы ожидаете увидеть" 2 " в качестве вывода, но вы этого не сделаете.


для однострочных операторов.

Если вы пытались сделать

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

Если я не ошибаюсь, интерпретатор php возьмет вторую строку под оператором foreach как находящуюся вне подразумеваемых фигурных скобок

из-за отступа, если вы вернулись к этому коду позже, или другой разработчик посмотрел на вашу работу, это было бы запутанно.

как таковой обычно разумно всегда использовать фигурные скобки с этими утверждениями. Это сэкономит позже головная боль/путаница


дополнить @Marko's ответ, имейте в виду, что при использовании оператора точки для этого вопроса, Вы должны заключить каждую операцию в скобки, в противном случае он будет обратный порядок.

например, этот код будет печатать 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");

это возможно, когда у вас есть только одно выражение после пункта/

например,

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


ответ прост. То же самое и в C/C++.

if, if / else, if/ else if / else и loops => если следующий оператор-одна строка, вы можете опустить фигурные скобки.

Ex:

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>";

когда я могу опустить фигурные скобки и в какой структуре/петле/функции? Я знаю, что я определенно могу сделать это в if и else. Но как насчет ... пока, для и foreach?

на If / else возможно один и несколько операторов без фигурных скобок с помощью следующей конструкции:

<?php
  if ($x):
    echo 'foo';
    echo 'bar';
  else:
    echo 'nofoo';
    echo 'nobar';
  endif;
?>

как описано в ответ

на пока, на и foreach, только один заявления допускаются без фигурных скобок

<?php
foreach($array as $x => $y)
    $do_something = $x;
?>

PHP стенографическое выражение было доступно с PHP 5.3

$condition ? $value_if_true : $value_if_false

$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )