我正在尝试检查$ _GET [' id']是否已设置并且是数字否则会导致代码执行死亡。
以下两个代码对我有用,但想知道它们之间的区别是什么?
php condition 1
<?php
if(!isset($_GET['id']) || (isset($_GET['id']) && !is_numeric($_GET['id']))) {
die();
}
php condition 2
<?php
if(!isset($_GET['id']) || !is_numeric($_GET['id'])) {
die();
}
答案 0 :(得分:5)
不同之处在于,如果设置了$_GET['id']
,第一个会进行不必要的额外检查。 PHP使用所谓的短路布尔评估,这意味着如果||
的左侧为真,则右侧不需要进行评估。因此,即使在第二个示例中,!is_numeric($_GET['id'])
也永远不会被评估,除非isset($_GET['id'])
为真。
逻辑上这些陈述是等价的。
答案 1 :(得分:3)
你基本上在做
A || (!A && B)
如果A
为true
,则其他内容将不会被执行。
如果A
为false,则!A
无论如何都是真的。所以!A
是多余的。
在功能上它们是相同的,但在实践中,你不需要额外的条件。
您可以在此处查看逻辑解释:
答案 2 :(得分:-4)
在第一个 它进行三次检查是不必要的。 在第二个中它不会捕获所需的条件之一
||表示OR - 其中一个条件应评估为真
&安培;&安培;意味着AND - 两个条件都必须为真
要正常工作,您需要这个
if (!isset($_GET['id']) && !is_numeric[$_GET['id']])
die();
第一个声明做同样的事情,但检查$ _GET [&#39; id&#39;]是否设置了两次,这是不需要的。