условные выражения — Какая разница в этих двух условиях php?

я пытаюсь проверить, установлено ли значение $ _GET [‘id’] и является ли оно числовым, иначе выполнение кода прерывается.,

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

php условие 1

<?php
if(!isset($_GET['id']) || (isset($_GET['id']) && !is_numeric($_GET['id']))) {
die();
}

php условие 2

<?php
if(!isset($_GET['id']) || !is_numeric($_GET['id'])) {
die();
}

1

Решение

Разница в том, что первый имеет ненужную дополнительную проверку, если $_GET['id'] установлено. PHP использует то, что называется логическим вычислением короткого замыкания, что означает, что если левая сторона || верно, правая сторона не нуждается в оценке. Так что даже во втором примере !is_numeric($_GET['id']) никогда не будет оценен, если isset($_GET['id']) правда.

Логически эти утверждения эквивалентны.

5

Другие решения

Вы в основном делаете

A || (!A && B)

если A является trueтогда остальные не будут выполнены.

Если A ложно, !A все равно будет правдой. Итак !A избыточно

Функционально они одинаковы, но на практике вам не нужно дополнительное условие.

Вы можете увидеть логическое объяснение здесь:

логика

3

В первом
Он делает три проверки, которые не нужны.
Во втором он не поймает одно из необходимых условий

|| означает ИЛИ — любое из условий должно оцениваться как истинное

&& означает И — оба условия должны быть выполнены

Для правильной работы вам нужно это

if (!isset($_GET['id']) && !is_numeric[$_GET['id']])
die();

Первый оператор делает то же самое, но он проверяет, установлен ли $ _GET [‘id’] два раза, что не нужно.

-4