PHP троичный! Пусто, а не оценивается как истина или ложь - PullRequest
0 голосов
/ 07 ноября 2011

Можно ли использовать сокращенную троичную для проверки, установлена ​​ли переменная или нет, вместо того, оценивается ли она как ноль или не ноль?

Например, я попытался:

$var = 0;
echo (string) $var ?: (string) false ?: 2;

Но так как оба первых выражения оцениваются как "0" или "false", отображается 2.

Я думал, что приведение их к строке приведет к разным результатам, но это не так.Полагаю, ноль - ноль.

Я хочу использовать этот стиль при назначении переменных, таких как

$get->var = $get->var ?: $setindb ?: $default;

Я хочу присвоить $ get-> var для $ get-> var ifон установлен, в противном случае проверьте, имеет ли БД значение, в противном случае используйте значение по умолчанию.

Редактировать

Я подумал, что скажу, что знаю, что могу сделать что-то вроде

$get->var = (!empty($get->var)) ? $get->var : ( (!empty($setindb)) ? $setindb : $default )

Но ты будешь судьей, у которого проще:)

1 Ответ

2 голосов
/ 07 ноября 2011

Строки "0" и "false" считаются FALSE -y ( список ложных значений ) значений в PHP.

isset() возвращает TRUE для переменныхкоторые установлены, а не NULL.empty() проверит, что переменная установлена ​​и не является значением FALSE.Таким образом, он вернул бы TRUE для "0".

Я думаю, что вам нужен ваш третий фрагмент кода, но с isset(), а не empty().

Самый простой способ сделать (с наименьшим количеством скобок), который будет:

$get->var = isset($get->var) ? $get->var : (isset($setindb) ? $setindb : $default);

Поскольку сокращенное тенор возвращает первый параметр, вы не можете его использовать, потому чтобудет логическим(isset($get->var) ?: $default вернул бы TRUE, FALSE или $default, но никогда не значение $get->var.)


Редактировать: Возможно, вы хотите что-то вроде функции объединения?Насколько я знаю, PHP не предлагает его изначально, но его создание тривиально.Обратите внимание, что это может быть немного уродливо из-за использования передачи ссылок на функцию.Я был бы заинтересован в комментариях по этому поводу (это так же плохо, как я думаю?).

function coalesce(array $values)
{
    foreach($values as &$value)
    {
        if(isset($value))
            return $value;
    }
    return null;
}
$this->var = coalesce(array(&$this->var, &$setindb, $default));

Я не проверял выше.Передайте переменные в массиве как ссылки (& символ).Я почти уверен, что он захлебнется чем-то вроде coalesce(array(1,"a_string",false));.

...