PHP: скобки или без скобок с if /for /while /...?

Оба эти синтаксиса правильны и эквивалентны:

В скобках:

foreach ($listOfThings as $thing) {
  echo $thing;
}

Без скобок:

foreach ($listOfThings as $thing):
  echo $thing;
endforeach;

Возникают два вопроса:

  • Есть ли какая-либо реальная разница между ними или они полностью идентичны (например, исполнение)?

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

Я подозреваю, что это вопрос вкуса и стандартов компании, но я не уверен в этом.

6 голосов | спросил SteeveDroz 7 J000000Thursday11 2011, 18:27:58

5 ответов


23

Вы всегда должны использовать скобки . Вы столкнетесь с кодом (и даже с некоторыми фреймворками!), Которые не заключают скобки на коротких циклах или ifs, но когда дело доходит до него, нет лучшего способа сделать ваш код запутанным и трудночитаемым, чем оставить скобки. Насколько я знаю, в любом случае также нет существенной производительности.

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

ответил Jarrod Nettles 7 J000000Thursday11 2011, 18:31:38
10

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

Мне нравится метод без скобок, когда вы используете foreach или другой тип блока (if, while и т. Д.) И есть выход HTML или что-то еще там. Это связано с тем, что там может быть много кода в середине, и это дает понять, что заканчивается. Из-за этого этот стиль кодирования стал стандартом среди разработчиков темы Wordpress. (Примеры этого можно найти здесь: Wordpress Loop ).

Примечание. Этот вопрос отличается от вопроса «Должен ли я использовать скобки для однострочных блоков». Большинство языков не имеют другого способа разграничения многострочных блоков. В большинстве языков существует только один способ (например, фигурные скобки) для многострочных блоков.

Вот простой пример того, где мне нравится использовать подход «без скобок»:

<?php foreach ($listeOfThings as $thing): ?>
    <li><?= $thing ?></li>
<?php endforeach; ?>
ответил dontangg 7 J000000Thursday11 2011, 18:33:50
4

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

<? if (someCondition): ?>
    imagine a bunch of code here
    <? foreach ($rows as $row): ?>
       imagine a bunch more code here
    <? endforeach ?>    (without this, PHP complains about "unexpected T_ENDIF")
    and a bunch more here
<? endif ?>

<? if (someCondition) { ?>
    imagine a bunch of code here
    <? foreach ($rows as $row) { ?>
        imagine a bunch more code here
    <? } ?>             (without this, PHP complains about "unexpected $end")
    and a bunch more here
<? } ?>

В первом примере ошибка в значительной степени ограничивается блоком if (и все, что внутри него), и PHP задыхается от него раньше (и, таким образом, ближе к реальной ошибке). Во втором, PHP доходит до конца скрипта, прежде чем понимать, что фигурные скобки не совпадают. Это потенциально намного больше кода для поиска отсутствующей фигурной скобки.

Люди, предпочитающие фигурные скобки, похожи на «хорошо, если вы правильно отпечатаете свой код, скобки будут такими же удобочитаемыми». Дело в том, что есть несколько проблем:

  • Не все так же религиозны в отношении форматирования кода, как и вы. Особенно, что новый парень, который исправляет ваш код, находясь в отпуске.
  • Скобки not , «как можно читаемые». Период. Мне все равно, насколько вам нравятся C, C #, Java или какой-либо другой язык, который учил вас, что скобки были хорошими. Дело в том, что для структур управления существуют гораздо лучшие синтаксисы - и на самом деле PHP включает в себя один.
    • Скобки - пунктуация. Один символ пунктуации. Часто окруженный другими пунктуациями. Их легко пропустить. Мне кажется, что мозг фактически пытается отфильтровать пунктуацию в два раза.
    • Я не знаю о вашем редакторе, но мои основные моменты. Они выделяются и становятся длиннее, и поэтому их легче обнаружить. Он также подчеркивает фигурные скобки и даже пытается выделить подходящую фигуру ... но независимо от того, насколько ярко вы будете раскрашивать фигурные скобки, они не будут выделяться, а также цельное выделенное слово.
    • Подтяжки просто говорят «закрыть что-то». Они не говорят , что закрывать. Они просто не могут передавать эту информацию самостоятельно. Они полагаются на вас всегда ( ВСЕГДА! ) отступ «правильно» и жестоко избивают любого программиста, который этого не делает (или использует пробелы вместо вкладок или вкладки вместо пробелов или что-то другое, стиль есть). Это или вы добавляете комментарии, такие как // end if. И если вы ever обнаруживаете, что добавляете такие комментарии ... почему, черт возьми, вы избегаете ключевого слова, которое делает то же самое, но может быть действительно проверено интерпретатором?
ответил cHao 7 +04002011-10-07T23:21:52+04:00312011bEurope/MoscowFri, 07 Oct 2011 23:21:52 +0400 2011, 23:21:52
1

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

ответил Gus 7 J000000Thursday11 2011, 19:10:01
-1

Синтаксис без скобок хорош для размещения HTML-кода между контуром, как указано в ответе dontangg. Это делает код более понятным.

ответил Cracker 7 J000000Thursday11 2011, 18:41:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132