PHP троичный !пусто, а не оценивается как true или false

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

Например, я пробовал:

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

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

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

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

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

Я хочу присвоить $get-›var переменной $get-›var, если она установлена, в противном случае проверьте, имеет ли база данных значение, в противном случае используйте значение по умолчанию.

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

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

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

Но вам судить, у чего проще :)


person Senica Gonzalez    schedule 07.11.2011    source источник
comment
почему бы вам вместо этого не использовать isset($get-›var)?   -  person SERPRO    schedule 07.11.2011
comment
ну, вместо пустого, в моем примере выше, isset был бы более подходящим, но это все еще ставит меня в ту же ситуацию. Я искал более чистый и простой способ сделать это.   -  person Senica Gonzalez    schedule 07.11.2011


Ответы (1)


Строка "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));.

person RickN    schedule 07.11.2011
comment
ладно, не знал, есть ли какой-то трюк (например, приведение), который тернар будет проверять, кроме истинного или ложного - person Senica Gonzalez; 07.11.2011
comment
В PHP7 оператор объединения реализован с помощью ?? php.net/manual/ ru/ - person Mauro Zadunaisky; 17.02.2017