PHP - если /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;. Я не хочу узнавать о сокращении. Я просто хочу понять условия, когда и где можно опустить фигурные скобки.

Ответ 1

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

if ($x) echo 'foo';

совпадает с

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

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

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

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

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

То же самое для других управляющих операторов (foreach и т.д.)

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Как уже говорилось, вы не хотите узнать о сокращенном, и принятый ответ дает хороший пример об исключении curly braces, но есть что добавить. Как вы можете видеть, что в случае if ($x) echo 'foo'; можно опустить curly braces. В коде нет ничего плохого, нет производительности или других проблем, и это можно прочитать другими разработчиками. И пример также показывает вам, что если вы пишете

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

вместо

if ($x)
    echo 'foo';

echo 'bar';

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

Я не хочу узнать о сокращении. Я просто хочу понять условия, когда и где можно опустить фигурные скобки.

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

Итак, мой большой вопрос: когда я могу опустить фигурные скобки и в какой структуре/петле/функции?

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

  • Легко ли поддерживается код, который вы пишете.
  • Можете ли вы ответить за свое "я", есть что-то, что вы выиграли, опуская фигурные скобки.

Ответ 5

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

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

Ответ 6

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

if($a === true) continue;

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

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

С приведенным выше кодом вы ожидаете увидеть "2" в качестве вывода, но не будете.

Ответ 7

Для операторов с одной строкой.

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

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

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

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

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

Ответ 8

Чтобы дополнить @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");

Ответ 9

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

Например,

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

Ответ 10

Ответ прост. Это то же самое в C/С++.

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

Пример:

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