PHP троичный !пустой, а не принимает значение true или false

#php #ternary-operator

#php #тернарный оператор

Вопрос:

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

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

 $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 )
  

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

Комментарии:

1. почему бы вам не использовать вместо этого isset($get-> var)?

2. ну, вместо empty в моем примере выше isset был бы более подходящим, но это все равно ставит меня в ту же ситуацию. Я искал более чистый и простой способ сделать это.

Ответ №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 amp;$value)
    {
        if(isset($value))
            return $value;
    }
    return null;
}
$this->var = coalesce(array(amp;$this->var, amp;$setindb, $default));
  

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

Комментарии:

1. хорошо, не знал, есть ли какой-то трюк (например, приведение), который будет проверять троичный, отличный от true или false

2. В PHP7 реализован оператор объединения с?? php.net/manual/en /…