2013-04-17 2 views
-2

С тех пор у меня была функция во всех моих проектах: ifNot().PHP IF [FALSE/NULL/EMPTY] function

Эта функция как-то образовавшаяся из троичного оператора:

public function ifNot($item, $ifNot) 
{ 
    if (!$item) { 
     return $ifNot 
    } else { 
     return $item; 
    } 
} 
// The var $foo twice 
$var = ($foo) ? $foo : 'is empty or false =('; 
// The var $foo once 
$var = ifNot($foo, 'is empty or false =('); 

В самом деле, Twig Template Engine использовать что-то вроде этого:

{{ foo ? 'yes' : 'no' }} 

{# as of Twig 1.12.0 #} 
{{ foo ?: 'no' }} == {{ foo ? foo : 'no' }} 
{{ foo ? 'yes' }} == {{ foo ? 'yes' : '' }} 

Возникает вопрос: Существует лучше/известный подход для этой функции?

PS: SQL также имеет IFNULL() =)

+1

Это то, что мы называем абсолютно бессмысленной функцией! Он делает то, что вы можете так же легко обойтись без дополнительного вызова функции, и читать его еще не так просто? – adeneo

+0

Да, я задал этот вопрос, ища альтернативу =) –

ответ

4

Ваша функция по существу эквивалентно a variant of the conditional operator that was added in PHP 5.3:

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

Может быть немного быстрее использовать встроенный подход, если все целевые среды составляют PHP 5.3 или выше, но я бы не стал беспокоиться об этом.

+0

есть ли разница между этим поведением и простой '||'? Я пытаюсь понять, почему они добавили его в язык ... – Dave

+0

@Dave: 'a || b' оценивает 'TRUE' или' FALSE', тогда как 'a?: b' оценивается как' a', так и 'b'. Они делают разные вещи. –

+0

ah ok, получил мою главу JavaScript. – Dave

0
$var = ifNot($foo, 'is empty or false =('); 

так же, как:

$var = $foo?:'is empty or false =('; 

В обычном PHP (> = версия 5.3) тоже. Ваша функция ifNot полностью излишняя.

+0

[Только с PHP 5.3] (http://www.php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary). –

+2

@LightnessRacesinOrbit Right. Но с некоторого времени я предполагаю, что у пользователя есть как минимум 5,3 (поскольку 5.2 не поддерживается) – bwoebi

+0

@bwoebi Если только :( – PeeHaa

2

Да, если ваш PHP достаточно новый (5.3.0 или новее). См. PHP documentation on the ternary operator

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

Таким образом, хотя ваш код выше является довольно неудобно, могут быть случаи, когда вы хотите функцию версии этого тройного оператора (например, для использования в качестве callable - в тех случаях, вы можете просто свернуть с укупорочное:

function($foo, $default) { return $foo ?: $default; }