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


person headacheCoder    schedule 04.01.2012    source источник
comment
Кстати, после закрывающей скобки ставить точку с запятой не обязательно. Синтаксическое значение этого - добавление пустого оператора между ними. Это верно для всех C-подобных языков, за исключением объявлений struct и class в C и C ++.   -  person Eric    schedule 04.01.2012
comment
Вам нужно понять разницу между операторами и выражениями, чтобы понять, когда фигурные скобки нельзя исключать. И тогда еще необходимо четкое понимание сплоченности выражения.   -  person mario    schedule 04.01.2012


Ответы (12)


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

if ($x) echo 'foo';

такой же как

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

но помни это

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

будет всегда печатать «полосу»

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

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

person KingCrunch    schedule 04.01.2012
comment
Очень красивое и короткое объяснение, спасибо! :) Работает ли он над каждой структурой управления? - person headacheCoder; 04.01.2012
comment
Должно. в настоящее время не знаю (и не могу проверить), что насчет do{}while($X); или «switch». - person KingCrunch; 04.01.2012
comment
@headacheCoder Да, работает для for, while, foreach и if. Так же и для всех языков с синтаксисом, подобным Си. Обратите внимание на ответ @tkone о том, что рекомендуется всегда использовать фигурные скобки. - person Eric; 04.01.2012
comment
@headacheCoder: он работает даже с каждым выражением, см. php.net/expressions. - person hakre; 04.01.2012
comment
@Eric: Да, я заметил это, но это не было частью моего вопроса. Я всегда стараюсь писать чистый и удобный код. Это было больше просто понимание синтаксиса. :) - person headacheCoder; 04.01.2012
comment
Есть исключение; он не работает с исключениями. Каламбур полностью предназначен. - person Francisco Presencia; 13.03.2013
comment
@FrankPresenciaFandos Вы имеете в виду try-catch? Потому что Exception - это в первую очередь класс;) Да, альтернативного синтаксиса для try-catch просто не существует (не знаю, имеет ли это более глубокая причина, или он просто забыт). - person KingCrunch; 13.03.2013
comment
XDebug не будет останавливаться на / переходить в оператор в условном блоке без фигурных скобок. Пожалуйста, используйте скобки! - person Jon Hudson; 19.02.2015
comment
Даже для одного утверждения это не всегда работает. if ( true ) function myFunc() { return true; } выдает ошибку Syntax error, unexpected T_STRING, expecting '(' - person s3c; 07.01.2021

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

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

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

person tkone    schedule 04.01.2012

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

if(a < 1 ) :
    echo "a is less than 1";
else :
    echo "a is greater than 1";
endif;
person site stats    schedule 04.01.2012

Как уже было сказано, вы не хотите изучать стенографию, и принятый ответ дает хороший пример опускания 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. Легко ли поддерживать код, который вы пишете?
  2. Можете ли вы ответить за себя, есть ли что-то, что вы выиграете, опустив фигурные скобки?
person mkungla    schedule 25.01.2016
comment
Хм, я не знал, что они добавили нулевой оператор объединения к оператору Элвиса ... аккуратно. Но какая сторона оператора имеет значение NULL, и разрешает ли он неустановленные переменные в условном блоке? - person Ber; 21.06.2016
comment
$I_want_value = $if_im_not_null_use_me ?? $if_first_is_null_use_me ?? $if_second_is_null_use_me; Итак, у вас может быть столько альтернатив, сколько у вас, если предыдущая переменная имеет значение NULL; Новые возможности PHP 7 - person mkungla; 21.06.2016
comment
Интересно, значит, это бесконечный оператор ... но работает ли он с неопределенными переменными? Я проверю документ. Я бы подумал, что это единственная цель наличия нулевого оператора объединения, иначе почему бы просто не использовать Элвиса. ? :) - person Ber; 22.06.2016
comment
Ах так, ?? работает с неустановленными переменными, говорится в документации. чудесно! Это может уменьшить массу вызовов isset () в PHP. - person Ber; 22.06.2016

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

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>
person Georg Leber    schedule 04.01.2012
comment
альтернативный синтаксис отличается. - person KingCrunch; 04.01.2012
comment
ОП даже сказал, что он знает об альтернативном синтаксисе и не в том, о чем идет речь. - person CommandZ; 19.03.2014

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

if($a === true) continue;

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

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

С приведенным выше кодом вы ожидаете увидеть на выходе цифру «2», но этого не произойдет.

person Iliya Kolev    schedule 21.05.2015

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

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

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

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

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

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

person Pete Mitchell    schedule 04.01.2012
comment
Ты прав. Вторая строка не входит в цикл. Только следующее выражение есть. - person CommandZ; 19.03.2014

Чтобы дополнить ответ @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");
person Renan Decarlo    schedule 31.07.2016

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

Например,

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

person nikans    schedule 04.01.2012

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

if, if / else, if / else if / else and 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>";
person AlexPac    schedule 21.04.2015

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

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

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

Как описано в этом ответе < / а>

Для while, для и foreach разрешены только отдельные инструкции без фигурных скобок.

<?php
foreach($array as $x => $y)
    $do_something = $x;
?>
person Duffmannen    schedule 08.08.2018

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

$condition ? $value_if_true : $value_if_false

$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
person Flames    schedule 19.09.2018