я пытаюсь проверить, установлено ли значение $ _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();
}
Разница в том, что первый имеет ненужную дополнительную проверку, если $_GET['id']
установлено. PHP использует то, что называется логическим вычислением короткого замыкания, что означает, что если левая сторона ||
верно, правая сторона не нуждается в оценке. Так что даже во втором примере !is_numeric($_GET['id'])
никогда не будет оценен, если isset($_GET['id'])
правда.
Логически эти утверждения эквивалентны.
Вы в основном делаете
A || (!A && B)
если A
является true
тогда остальные не будут выполнены.
Если A
ложно, !A
все равно будет правдой. Итак !A
избыточно
Функционально они одинаковы, но на практике вам не нужно дополнительное условие.
Вы можете увидеть логическое объяснение здесь:
В первом
Он делает три проверки, которые не нужны.
Во втором он не поймает одно из необходимых условий
|| означает ИЛИ — любое из условий должно оцениваться как истинное
&& означает И — оба условия должны быть выполнены
Для правильной работы вам нужно это
if (!isset($_GET['id']) && !is_numeric[$_GET['id']])
die();
Первый оператор делает то же самое, но он проверяет, установлен ли $ _GET [‘id’] два раза, что не нужно.