it-swarm.com.ru

PHP - Если/еще, ибо, foreach, пока - без фигурных скобок?

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

46
headacheCoder

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

if ($x) echo 'foo';

такой же как

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

но помни это

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

будет всегда распечатать "бар"

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

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

77
KingCrunch

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

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

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

27
tkone

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

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

Как уже говорилось, вы не хотите узнавать о сокращенном, и принятый ответ дает хороший пример пропуска curly braces, но есть что добавить. Как вы можете видеть, в случае if ($x) echo 'foo'; не нужно указывать curly braces. В коде нет ничего плохого, нет проблем с производительностью и других проблем, и он может быть прочитан другими разработчиками. И пример также показывает, что если вы пишете

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 мы можем использовать оператор объединения нулей

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

Как видно, есть много способов получить точно такой же результат. Это относится не только к этому примеру if, но и с structure/loop/function может быть осуществлено то же самое. Так что нет единого ответа на ваш большой вопрос. Следует учитывать в основном следующее.

  1. Код, который вы пишете, прост в обслуживании.
  2. Можете ли вы ответить за себя, есть ли что-то, что вы выигрываете, опуская фигурные скобки.
5
mkungla

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

<ul>
    <?php foreach ($var as $value): ?>
        <li><?php echo $value; ?></li>
    <?php endforeach; ?>
</ul>
3
Georg Leber

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

if($a === true) continue;

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

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

С кодом выше, вы ожидаете увидеть «2» в качестве вывода, но вы не будете.

2
Iliya Kolev

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

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

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

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

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

В качестве такового обычно целесообразно всегда использовать фигурные скобки с этими утверждениями. Это спасет позже головную боль/беспорядок

1
Pete Mitchell

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

Ответ прост. Это то же самое в 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>";
0
AlexPac

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

Например, 

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

0
nikans

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

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

<?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;
?>
0
Duffmannen

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

$condition ? $value_if_true : $value_if_false

$a ? $b : ( $c ? $d : ( $e ? $f : $g ) )
0
Midhun1993