Разница между PHP ??, ?: и ??=

Что-то я не совсем понимаю, чем ??, ?: и ??= отличаются в PHP?

Я знаю, что ??= был добавлен только в PHP7.4. Я также знаю, что ?? предназначен для проверки нулевых значений, но ?:, кажется, также проверяет нулевые значения, поэтому я не совсем уверен в разнице.

Посмотрите здесь stackoverflow.com/questions/59102708/…

Guido Faecke 17.05.2022 00:18

@GuidoFaecke Я спрашиваю о разнице между тремя не исключительно ??= Это дает мне частичный ответ о ??=. Я все еще не совсем понимаю ?? и ?:.

QuestionMark 17.05.2022 00:20

Первый ответ в посте выше объясняет это... в любом случае ?: - это ваш типичный тернарный оператор, похожий на if/else. ?? как в $test = $data ?? false проверяет против всех, иначе. ноль сливаются. ??= — это еще одно сокращение для null-coalesce, как в $data ??= false. В этом случае вы устанавливаете значения по умолчанию $data, если $data равно null.

Guido Faecke 17.05.2022 00:25

Также, возможно, см. здесь Elvis-Operator vs Null Coalescing Operator

Aranxo 17.05.2022 01:22

Отвечает ли это на ваш вопрос? Оператор PHP Elvis против оператора объединения null

Aranxo 17.05.2022 01:25

@Aranxo, этот вопрос не только отвечал на этот вопрос, я спрашивал обо всех трех, а не только об этих двух.

QuestionMark 17.05.2022 01:26

Извините, я пометил ваш вопрос как уже отвеченный для рассмотрения администраторами. Впервые я сделал такую ​​вещь когда-либо. Я не знал, что это создаст еще один ответ. Так что я по сути ответил вам дважды одно и то же. :-/

Aranxo 17.05.2022 01:37
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Что нового в PHP 8.1?
Что нового в PHP 8.1?
Если вы все еще используете PHP 7, то эта статья для вас. В PHP 8, а именно в PHP 8.1, встроены некоторые очень востребованные функции, которые вам...
Разработка LMS на заказ для повышения эффективности работы и обучения
Разработка LMS на заказ для повышения эффективности работы и обучения
За последние годы в образовании произошла большая революция, и сегодня почти все учебные заведения делают упор на эксклюзивное управление учебным...
0
7
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объединить все ответы, уже сделанные в предыдущих вопросах. С ?? вы проверяете наличие и отсутствие 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 не удалось, массив пуст, и цикл просто ничего не сделает.

Другие вопросы по теме

Отображать последнее, 2-е последнее и 3-е последнее значение из базы данных и отображать в определенном порядке
Как скрыть рекламу после того, как пользователь перезагрузил страницу x раз Laravel
1062 Повторяющаяся запись «Общие» — пропустите вставку, если уже есть категория с таким же названием.
Удалить строку между строками и заменить текстом плюс счетчик
Изменить сообщение переменной %s разделителя: «Вы не можете добавить еще один «%s» в свою корзину» в WooCommerce
Сохранение основных категорий из запроса API в базу данных
Неустранимая ошибка: необработанная ошибка: неопределенная константа "​" и вопрос массива
Как использовать переменные вместо имен столбцов для запуска новых миграций непосредственно в контроллере
НАЙТИ отсутствующее число, а также минимальное и максимальное значение и найдите количество повторяющихся значений БЕЗ использования встроенных функций PHP. Проверено много, но не подходит для меня.
Проблема с открытием представления, Ошибка 404, Не найдено