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 . Но как насчет того, for и for ?

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

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

 if ($x) echo 'foo'; 

такой же как

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

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

 if ($x) echo 'foo'; echo '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 мы можем использовать оператор Null-коалесценции

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

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

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

Вы также можете использовать оператор и для этого. Вот так:

 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, если / 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>";