Что-то я не совсем понимаю, чем ??
, ?:
и ??=
отличаются в PHP?
Я знаю, что ??=
был добавлен только в PHP7.4.
Я также знаю, что ??
предназначен для проверки нулевых значений, но ?:
, кажется, также проверяет нулевые значения, поэтому я не совсем уверен в разнице.
@GuidoFaecke Я спрашиваю о разнице между тремя не исключительно ??=
Это дает мне частичный ответ о ??=
. Я все еще не совсем понимаю ??
и ?:
.
Первый ответ в посте выше объясняет это... в любом случае ?:
- это ваш типичный тернарный оператор, похожий на if/else. ??
как в $test = $data ?? false
проверяет против всех, иначе. ноль сливаются. ??=
— это еще одно сокращение для null-coalesce, как в $data ??= false
. В этом случае вы устанавливаете значения по умолчанию $data
, если $data
равно null
.
Также, возможно, см. здесь Elvis-Operator vs Null Coalescing Operator
Отвечает ли это на ваш вопрос? Оператор PHP Elvis против оператора объединения null
@Aranxo, этот вопрос не только отвечал на этот вопрос, я спрашивал обо всех трех, а не только об этих двух.
Извините, я пометил ваш вопрос как уже отвеченный для рассмотрения администраторами. Впервые я сделал такую вещь когда-либо. Я не знал, что это создаст еще один ответ. Так что я по сути ответил вам дважды одно и то же. :-/
Объединить все ответы, уже сделанные в предыдущих вопросах. С ??
вы проверяете наличие и отсутствие null
, с ?:
вы проверяете true/false
.
$result = $a ?? $b
такой же как:
if (isset($a) && !is_null($a)) {
$result = $a;
} else {
$result = $b;
}
??=
— это сокращение для ??
, и оно также работает как .=
или +=
, что означает, что вы можете сократить
$a = $a ?? $b;
к
$a ??= $b;
?:
— это сокращение для тернарного оператора, который также является сокращением:
if ($a) {
$result = $a;
} else {
$result = $b;
}
такой же как:
$result = $a ? $a : $b;
такой же как:
$result = $a ?: $b;
Вы оба можете описать так: первый операнд — это значение, которое нужно проверить, и если это полезно, возьмите его, если нет, возьмите второй по умолчанию.
Вы можете объединить их следующим образом:
$user = $_POST['user'] ?? $_SESSION['user'] ?? $_COOKIE['user'] ?? '';
Что означает что-то вроде: Если вы получаете имя пользователя в массиве POST из-за того, что просто вошли в систему, хорошо, возьмите его, если нет, посмотрите, вошел ли пользователь уже в систему и в сеансе, если да, возьмите его, если нет, может быть, у нас есть пользователь в Cookies (установил флажок «запомнить меня» при последнем входе в систему), и если это также не удается, ну, тогда оставьте его пустым.
Конечно, вы также должны проверить пароль. ;-)
Редактировать: я очень часто использую оператор ?:
, чтобы убедиться, что у меня есть определенный тип данных в переменной. Есть много функций PHP, которые возвращают, может быть, строку или массив в случае успеха, но false
если произошла какая-то ошибка. Вместо того, чтобы иметь в результате false, более согласованным является наличие пустой строки или пустого массива. Например, scandir
должен вернуть массив, но возвращает false
в случае ошибки. Итак, вы можете сделать это:
$files = scandir('/some/random/folder') ?: [];
Тогда $files
всегда будет массивом, даже если scandir
не удастся. Ну, тогда это пустой массив, но, может быть, лучше, чем потом сверяться с false
. На самом деле, мы уже сделали это с очень небольшими усилиями. Затем вы можете использовать цикл foreach
без переноса if
. Если scandir
не удалось, массив пуст, и цикл просто ничего не сделает.
Посмотрите здесь stackoverflow.com/questions/59102708/…