2010-08-27 4 views
11

Я использую тернарный оператор довольно часто, но я не смог найти что-либо в документации об этом, и я всегда удивлялся этому.Уточнение оператора PHP Ternary

Ниже приведен возможный пример:

echo ($something->message ? $something->message : 'no message'); 

, как вы можете видеть, если $ something-> сообщение является правильным, мы возвращаем $ something-> сообщение, но зачем писать дважды? Есть ли способ сделать что-то вроде:

echo ($something->message ? this : 'no message'); 

Сейчас я не очень хорошо разбирается в теории программирования, так что возможно, что есть причина, по которой бывший нельзя ссылаться с чем-то как «это», но почему нет? Не приведет ли это к потоку использование тернарного оператора? За то, как мой пример это довольно бесполезно, но скажем, что это

echo (function(another_function($variable)) ? function(another_function($variable)) : 'false'); 

Я не могу найти любой способ сделать это, так что я предполагаю, что это не возможно, если я ошибаюсь, пожалуйста, сообщите меня, иначе: почему бы и нет? Почему это невозможно, какова техническая причина, или это просто то, чего никогда не было? Должен ли я объявлять его как переменную, а затем тестировать эту переменную?

+0

Возможный дубликат [Имеет ли PHP именован по умолчанию как perl?] (Http://stackoverflow.com/questions/2958630/does-php-have-a-default-assignment-idiom-like-perl) – outis

ответ

19

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

Source

Например

$used_value = function1() ?: $default_value; 

То же самое,

$check_value = function1(); //doesn't re-evaluate function1() 
if($check_value) { 
    $used_value = $check_value; 
} else { 
    $used_value = $default_value; 
} 

Слова для мудрого

Если вы будете в зависимости от типа приведения к TRUE, важно понимать, что будет с помощью метода WILL TRUE, а что нет. Вероятно, стоит разобраться на PHP type juggling и прочитать type conversion tables. Например, (bool)array() - FALSE.

+1

Тот, кто представил этот патч, мой герой. Я просто читал эту страницу и, казалось, пропустил эту часть. Спасибо, может быть, я должен обновиться. Я приму свой ответ, когда истечет срок! – sam

+0

'echo ($ something-> message?: 'No message');' в случае первого примера OP. –

+1

+1 Оставьте его на php, чтобы удивить вас неясной реализацией тройного оператора всех вещей :) Должен любить несоответствия .. –

Смежные вопросы