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;
. Я не хочу изучать стенографию, я просто хочу понять условия о том, когда и где можно опустить фигурные скобки.
12 ответов
когда вы опустите скобки, он будет рассматривать только следующий оператор как тело условия.
if ($x) echo 'foo';
это то же самое, что
if ($x) { echo 'foo'; }
но помните, что
if ($x)
echo 'foo';
echo 'bar';
будет всегда печать "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 мы можем использовать нулевое объединение оператор
(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 " в качестве вывода, но вы этого не сделаете.
для однострочных операторов.
Если вы пытались сделать
foreach($array as $x => $y)
$do_something = $x;
$do_something_else = $y;
Если я не ошибаюсь, интерпретатор php возьмет вторую строку под оператором foreach как находящуюся вне подразумеваемых фигурных скобок
из-за отступа, если вы вернулись к этому коду позже, или другой разработчик посмотрел на вашу работу, это было бы запутанно.
как таковой обычно разумно всегда использовать фигурные скобки с этими утверждениями. Это сэкономит позже головная боль/путаница
дополнить @Marko's ответ, имейте в виду, что при использовании оператора точки для этого вопроса, Вы должны заключить каждую операцию в скобки, в противном случае он будет обратный порядок.
например, этот код будет печатать 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($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, if/ else if / else и 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>";
когда я могу опустить фигурные скобки и в какой структуре/петле/функции? Я знаю, что я определенно могу сделать это в if и else. Но как насчет ... пока, для и foreach?
на If / else возможно один и несколько операторов без фигурных скобок с помощью следующей конструкции:
<?php
if ($x):
echo 'foo';
echo 'bar';
else:
echo 'nofoo';
echo 'nobar';
endif;
?>
как описано в ответ
на пока, на и foreach, только один заявления допускаются без фигурных скобок
<?php
foreach($array as $x => $y)
$do_something = $x;
?>
PHP стенографическое выражение было доступно с PHP 5.3
$condition ? $value_if_true : $value_if_false
$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )