Условия PHP, скобки нужны?

Я просто просматривал форум, и кто-то спросил о файле PHP, который они нашли в сети. В коде есть несколько таких мест:

if ($REMOTE_ADDR == "") $ip = "no ip"; else $ip = getHostByAddr($REMOTE_ADDR);

Я всегда думал, что скобки необходимы, чтобы заключить то, что вы хотите сделать, если условие истинно. Есть ли другая альтернатива, например, если она находится на той же линии, что и вы?

Есть еще такая строчка: if ($action != ""): mail("$adminaddress","Visitor Comment from YOUR SITE",

Мой инстинкт - сказать, что это не сработает, но я также не знаю, является ли это устаревшим файлом PHP и работал ли он раньше?


person Levi    schedule 19.12.2008    source источник


Ответы (7)


вы можете использовать такие операторы if else:

<?php
if ($something) {
   echo 'one conditional line of code';
   echo 'another conditional line of code';
}


if ($something) echo 'one conditional line of code';

if ($something)
echo 'one conditional line of code';
echo 'a NON-conditional line of code'; // this line gets executed regardless of the value of $something
?>



а затем вы также можете написать if - else в альтернативном синтаксисе:

<?php
if ($something):
   echo 'one conditional line of code';
   echo 'another conditional line of code';
elseif ($somethingElse):
   echo 'one conditional line of code';
   echo 'another conditional line of code';
else:
   echo 'one conditional line of code';
   echo 'another conditional line of code';
endif;
?>



с альтернативным синтаксисом вы также можете выйти из режима синтаксического анализа следующим образом:

<?php
if ($something):
?>
one conditional line of code<br />
another conditional line of code
<?php
else:
   echo "it's value was: $value<br />\n";
?>
another conditional line of code
<?php
endif;
?>

Но это очень быстро становится беспорядочным, и я не рекомендую его использовать (за исключением, может быть, логики шаблона).



и для завершения:

<?php
$result = $something ? 'something was true' : 'something was false';
echo $result;
?>

equals

<?php
if ($something) {
   $result = 'something was true';
} else {
   $result = 'something was false';
}
echo $result;
?>
person Jacco    schedule 19.12.2008
comment
Ого, я не знал, что существует так много вариантов структурирования php-кода. Спасибо! - person Levi; 19.12.2008
comment
В последнем примере дополнительная переменная не нужна: echo $ something? 'что-то было правдой': 'что-то было ложью'; - person Darryl Hein; 19.12.2008
comment
Я знаю, что это работает, но я думаю, что где-то читал, что это был недокументированный результат (и поэтому он может измениться в будущей версии). Хотя не уверен. - person Jacco; 19.12.2008
comment
Не могли бы вы также использовать elseif для одной строки такого условного кода? if ($ something) $ result = 'что-то было правдой'; elseif ($ something_else) $ result = 'что-то еще было правдой'; else $ result = 'ничего не правда'; - person Adal; 23.02.2015
comment
Может ли elseif оставить условие if пустым? (т.е. работает ли elseif:?) - person AkiEru; 23.02.2015
comment
обратите внимание, что удобнее делать отступ для одной условной строки кода - person Reign.85; 10.04.2015
comment
вам нужно объяснить или добавить блок: elseif (CONDITION) ..., как следующий ответ, .... потому что второй блок вашего кода не имеет условия и не указывает, зачем использовать какое-то описание или часть кода: if (): {echos } elseif: {echos} else: - person ; 26.05.2015
comment
Мне нравится синтаксис «двоеточие», он действительно похож на питон, и мне гораздо легче читать код с правильным отступом. Раннее закрытие скобок - более распространенная ошибка, по крайней мере для меня, чем забвение endif. - person DDS; 20.08.2019

Если вдаваться в подробности, фигурные скобки необязательны, потому что их синтаксис выглядит так:

if(CONDITION) BLOCK
[elseif(CONDITION) BLOCK]
[else BLOCK]

БЛОК может быть одним выражением:

foo();

или это может быть группа операторов в фигурных скобках:

{
    foo();
    bar();
}
person chaos    schedule 19.12.2008

Скобки (не скобки) в PHP не обязательны, как и в большинстве C-подобных синтаксисов. Может быть, вы думаете о Perl; они требуются там для этой формы синтаксиса if.

Двоеточие - это альтернативная форма структуры управления, которую поддерживает PHP. Я ненавижу это, но некоторым людям (особенно разработчикам шаблонных систем, очевидно) это нравится.

person chaos    schedule 19.12.2008
comment
Спасибо, должно быть, я сначала выучил Perl, и, должно быть, более строгая сторона меня считала, что это неправильно. - person Levi; 19.12.2008

На мой взгляд

if ($REMOTE_ADDR == "") $ip = "no ip"; else $ip = getHostByAddr($REMOTE_ADDR);

действительно, но его труднее читать, чем:

if ($REMOTE_ADDR == "") {
    $ip = "no ip"; 
} else {
    $ip = getHostByAddr($REMOTE_ADDR);
}
person smartcoder    schedule 19.12.2008
comment
Мне нравится if(statement) process; else process2; все на отдельных строчках. Он выглядит так же, как и со скобками, за исключением скобок. - person JVE999; 24.07.2014

9 лет спустя, и я удивлен, что никто не упомянул тернарный оператор:

$ip = ($REMOTE_ADDR == "") ? "no ip" : getHostByAddr($REMOTE_ADDR);

Гораздо яснее для присвоения IMHO - потому что это приводит к присвоению переменной, как и для обычного назначения переменных.

person Velojet    schedule 30.07.2018
comment
Ответ @ Jacco предоставляет этот пример. - person SQueryL; 20.12.2018

Да, исключение фигурных скобок разрешено, хотя много раз я слышал 2 причины не использовать этот синтаксис:

  1. Читать сложнее. Менее очевидно для другого программиста.
  2. Если вы когда-нибудь захотите добавить что-то внутри if, тогда вам нужно будет добавить фигурные скобки, что будет сложнее, чем когда вы впервые кодируете, поскольку большинство редакторов добавят закрывающую скобку за вас.

Кроме того, да, синтаксис двоеточия допустим. Альтернативы можно найти здесь: http://php.net/manual/en/control-structures.alternative-syntax.php

person Darryl Hein    schedule 19.12.2008
comment
--- 1. Сложнее читать. Менее очевидно для другого программиста. Это спорно. Многим программистам нравится поглощать больше кода с меньшей вертикальной прокруткой (я не говорю, что вам нужно писать несколько инструкций ;;; в одной строке). Таким образом вы сможете лучше увидеть большую картину. Но согласен, для режима отладки всегда лучше. - person PatlaDJ; 22.12.2012

brackets are needed to enclose what you want to do if the condition is true

Я не могу придумать ни одного языка, который требует этого

person Scott Evernden    schedule 19.12.2008