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;
, Я не хочу узнавать о сокращениях, я просто хочу понять условия, когда и где можно опустить фигурные скобки.
14 ответов
Когда вы опускаете фигурные скобки, он будет рассматривать только следующий оператор как тело условия.
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
печатается, когда вы не хотите, чтобы он печатался, и если ваш код полон таких утверждений, тогда вам будет сложнее читать свой собственный код и еще труднее другим читать его.
Я не хочу узнавать о сокращениях, я просто хочу понять условия, когда и где можно опустить фигурные скобки.
Эти вещи тесно связаны, поэтому, если вы действительно хотите понять, где можно опустить фигурные скобки, то это должно быть обязательным условием, которое вы понимаете или хотя бы знаете о стенографии, прочитали
Итак, мой главный вопрос: когда я могу опустить фигурные скобки и в какой структуре / цикле / функции?
Фигурная скобка не требуется, однако, для удобства чтения и обслуживания многие разработчики считают плохим стилем не включать их. Предыдущие 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
, Так что нет единого ответа на ваш большой вопрос. Следует учитывать в основном следующее.
- Код, который вы пишете, прост в обслуживании.
- Можете ли вы ответить за себя, есть ли что-то, что вы выигрываете, опуская фигурные скобки.
Я опускаю фигурные скобки в моих шаблонах 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" в качестве вывода, но вы не будете.
Чтобы дополнить ответ @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");
Когда я могу опустить фигурные скобки и в какой структуре / цикле / функции? Я знаю, что я могу определенно сделать это, если и еще. Но как насчет времени, для и foreach?
Для If / else можно иметь одно и несколько выражений без фигурных скобок, используя следующую конструкцию:
<?php
if ($x):
echo 'foo';
echo 'bar';
else:
echo 'nofoo';
echo 'nobar';
endif;
?>
Как описано в этом ответе
Для while, for и foreach допускаются только одиночные операторы без фигурных скобок
<?php
foreach($array as $x => $y)
$do_something = $x;
?>
Для однострочных операторов.
Если вы пытались сделать
foreach($array as $x => $y)
$do_something = $x;
$do_something_else = $y;
Если я не ошибаюсь, интерпретатор php будет занимать вторую строку в выражении foreach как выход за пределы подразумеваемых скобок.
Из-за отступа, если вы позже вернетесь к этому коду или другой разработчик посмотрел на вашу работу, это может привести к путанице.
В качестве такового обычно целесообразно всегда использовать фигурные скобки с этими утверждениями. Это спасет позже головную боль / беспорядок
Ответ прост. Это то же самое в C / C++.
if, if / else, if / 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>";
Это возможно, когда у вас есть только одно выражение после вашего предложения /
Например,
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
В какой-то момент своей жизни я также пропустил фигурные скобки, если следующий оператор содержал только одну строку.
Тогда я думал, что мой код выглядит круто и гладко, и что мне следует максимально экономить строки кода.
Но я понял, что в долгосрочной перспективе более полезно быть явным, особенно в отношении удобства сопровождения проекта.
Кроме того, мы никогда не должны жертвовать чем-то значительным ради микропроизводительности.
Совершенно нормально опускать фигурные скобки {} при выполнении одного действия внутри блока кода, но если вы будете выполнять два или более действий в этом блоке, вам нужно будет использовать для них фигурные скобки {}, иначе вы получит ошибку.
// Single action
if (true)
return 'true';
// Compound
if (true) {
$value = true;
return $value;
}
В одиночном действии вы можете опустить фигурные скобки {}, поскольку вы вернете значение напрямую.
В составном действии вам придется расставить фигурные скобки, потому что вы будете выполнять две вещи:
- присвойте логическое значение «истина» значению $value
- вернуть это $значение
Я надеюсь, что это имеет смысл.
Сокращенное выражение PHP было доступно с версии PHP 5.3
$condition ? $value_if_true : $value_if_false
$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )