Что есть ?: в PHP 5.3?

Возможное дублирование: Что такое операторы PHP «?» и «:» позвонили, и что они делают?

Из http://twitto.org/

<?PHP
    require __DIR__.'/c.php';
    if (!is_callable($c = @$_GET['c'] ?: function() { echo 'Woah!'; }))
        throw new Exception('Error');
    $c();
?>

Twitto использует несколько новых функций, доступных с PHP 5.3:

  1. Константа DIR
  2. Оператор
  3. Анонимные функции

  1. Что делает номер 2 с ?: в PHP 5.3?

  2. Кроме того, что они подразумевают под анонимными функциями? Разве это не существовало какое-то время?


person JasonDavis    schedule 28.01.2010    source источник
comment
Получили как минимум дважды ответ stackoverflow.com/questions/1080247/ и stackoverflow.com/questions/2099834/   -  person Gordon    schedule 28.01.2010
comment
@gordon, я знаю, что это значит по этим темам, я подумал, что это что-то другое, потому что на сайте сказано, что это НОВИНКА с версии 5.3, а также я никогда не видел их вместе, как?:   -  person JasonDavis    schedule 28.01.2010
comment
@Gordon, это только более длинные формы. @jasondavis, у вас есть: и? назад в заголовке вопроса.   -  person RJFalconer    schedule 28.01.2010
comment
Ах хорошо. Новинка в том, что вы можете опустить среднюю часть. Анонимные функции (лямбда и замыкания) также являются новым дополнением к версии 5.3, хотя раньше вы могли создавать функции с create_function.   -  person Gordon    schedule 28.01.2010
comment
это не дубликат.   -  person dwenaus    schedule 09.05.2014
comment
Это не дубликат рассматриваемого вопроса. Этот вопрос подразумевается в PHP 5.3.   -  person SaidbakR    schedule 13.12.2014
comment
Да, пожалуйста, ребята в достаточно больших шляпах, снимите поспешный, ошибочный флаг-дубликат! Другой связанный вопрос касается общего тернарного ответа со старыми, базовыми ответами, в то время как он касается сокращения (которое, по сути, является больше, чем просто синтаксическим сахаром!). Следуя этому неверному пути (тщетно пытаясь выяснить тонкость), я потратил слишком много минут в своей жизни. Умножьте это на количество людей, пострадавших таким же образом, и это может даже стать преступной категорией. ;)   -  person Sz.    schedule 12.10.2018


Ответы (3)


?: - это форма условного оператора, которая ранее была доступна только как:

expr ? val_if_true : val_if_false

В версии 5.3 можно не указывать среднюю часть, например expr ?: val_if_false, что эквивалентно:

expr ? expr : val_if_false

Из руководства:

Начиная с PHP 5.3, можно опустить среднюю часть условного оператора. Выражение expr1 ?: expr3 возвращает expr1, если expr1 оценивается как TRUE, и expr3 в противном случае.

person Ben James    schedule 28.01.2010
comment
Спасибо! Я был сбит с толку, когда увидел их вместе вот так ?: и искал, но ничего не нашел. - person JasonDavis; 28.01.2010
comment
Хм очень круто. Это делает ?: эквивалентным || в Javascript! - person Paul; 07.05.2012
comment
В качестве дополнительного бонуса вы можете связать их в цепочку: $ foo = $ bar?: $ Bazz?: $ Yadda?: $ Qux; // $ foo будет присвоено значение первой истинной переменной. Не уверен, что это ужасная идея (некоторым не нравится вложение тернарных операторов), но это так. - person MSpreij; 12.02.2014
comment
@MSpreij Я бы сказал, что это краткое его использование. Обычно вложение тернарных операторов ужасно, да (в некоторых случаях я бы простил до одного вложенного слоя). Альтернативой вышесказанному может быть очень длинный и уродливый блок if / elseif / else, который на самом деле является пустой тратой. Пока есть комментарий, такой как тот, который вы оставили для неопытных программистов, я бы нашел эту цепочку совершенно приемлемой (и на самом деле я очень рад ее использовать, спасибо, что указали на нее!). - person Demonslay335; 26.06.2017
comment
@MSpreij На самом деле, чтобы еще раз доказать, что это не ужасная идея, PHP 7 представил оператор объединения null (я сам забыл об этом), который делает то же самое и имеет тот же общий синтаксис, но разница в isset() и истинное значение. - person Demonslay335; 26.06.2017

Оператор ?: - это условный оператор (часто называемый тернарным оператором):

Выражение (expr1) ? (expr2) : (expr3) оценивается как expr2, если expr1 оценивается как TRUE, и expr3, если expr1 оценивается как FALSE.

В случае:

expr1 ?: expr2

Выражение оценивается как значение expr1, если expr1 истина, и expr2 в противном случае:

Начиная с PHP 5.3, можно опустить среднюю часть тернарного оператора. Выражение expr1 ?: expr3 возвращает expr1, если expr1 принимает значение ИСТИНА, и expr3 в противном случае.

person Gumbo    schedule 28.01.2010

Посмотрите здесь:

Начиная с PHP 5.3, можно опустить среднюю часть тернарного оператора. Выражение expr1?: Expr3 возвращает expr1, если expr1 имеет значение TRUE, и expr3 в противном случае.

Анонимные функции: Нет, их не было до версии 5.3. 0 (см. Первое примечание под примерами), хотя бы таким образом:

function ($arg) { /* func body */ }

Единственным способом был create_function(), что медленнее, довольно громоздко и подвержено ошибкам (из-за использования строк для определений функций).

person Boldewyn    schedule 28.01.2010