PHP - If / else, for, foreach, while - без фигурных скобок? - PullRequest
48 голосов
/ 04 января 2012

Что-то, что действительно хотелось бы знать, но никогда не узнавать, - это ярлыки в 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 ]

79 голосов
/ 04 января 2012

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

if ($x) echo 'foo';

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

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

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

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

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

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

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

26 голосов
/ 04 января 2012

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

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

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

11 голосов
/ 04 января 2012

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

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;
5 голосов
/ 25 января 2016

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

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 примеру, но и с 1010 *. Так что нет единого ответа на ваш большой вопрос . Следует учитывать в основном следующее.

  1. Легко ли поддерживать код, который вы пишете.
  2. Можете ли вы ответить за себя, есть ли что-то, что вы выигрываете, опуская фигурные скобки.
3 голосов
/ 04 января 2012

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

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>
2 голосов
/ 21 мая 2015

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

if($a === true) continue;

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

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

С кодом вышеожидал увидеть «2» как результат, но вы не увидите.

1 голос
/ 31 июля 2016

Чтобы дополнить ответ @ 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");
1 голос
/ 04 января 2012

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

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

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

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

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

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

0 голосов
/ 19 сентября 2018

Сокращенное выражение PHP было доступно с версии PHP 5.3

$condition ? $value_if_true : $value_if_false

$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
0 голосов
/ 08 августа 2018

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

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

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

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

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

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