#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 /…