在检查条件是真还是假时,是否有关于何时使用!=
而不是(!condition)
的规则或指南?
例如,我有一些页面在返回任何内容之前检查是否启用了TLS:
if ($_SERVER['HTTPS'] !== 'on') { exit; }
但我也可以这样写:
if (!$_SERVER['HTTPS'] === 'on') { exit; }
对于某些陈述,使用后者似乎最简洁,例如:
if (!isset($_SESSION)) { session_start(); }
...比等效物短:
if (isset($_SESSION) == false) { session_start(); }
是否有编写这些陈述的标准或指南,还是只是偏好?
注意:我理解==
和===
之间的区别,我只是想确保我的代码尽可能简洁明了。
答案 0 :(得分:3)
不要这样做:
if (!$_SERVER['HTTPS'] === 'on') { exit; }
!优先级高于===,因此评估为:
if ((!$x) === 'on') { ... }
在这种情况下,!$ x会将$ x强制转换为布尔值,然后将其反转。所以,如果$ x中有任何内容,你最终会得到:
if (false === 'on') { ... }
这对于$ x的任何值都不会匹配。
答案 1 :(得分:2)
我会参加比赛
if (!$_SERVER['HTTPS'] === 'on') { exit; }
指示性较低,因此比第一个变体的可读性低。
任何时候你都有像
这样的东西if ($var)
或
if (!$var)
你正在做的是将传递的值强制转换为他们的truthy / falsy值。所以这与以下内容不同:
if ($var === 'on')
正在测试特定的比较(不是它的真实/虚假)。
答案 2 :(得分:1)
嗯,这取决于你,但我尽量让听起来尽可能接近英语。
你会说:
If switch is not on then…
或
If not switch is on then…
我个人会说顶级的,所以会编写代码来跟随它。
对于第二个样式,如果该东西返回一个布尔值(即true或false),我永远不会将它与true或false进行比较,除非您必须使用strpos
之类的东西。
再一次,想到英语:
If not is set variable…
或
If is set variable is false…
就个人而言,顶部听起来更好,但当然两者都不是正确的。
这个逻辑也有助于命名变量和函数,所以我认为值得考虑。
答案 3 :(得分:1)
not !
运算符会反转语句。在某种情况下,它用于检查特定值是否会计算为false
。从PHP manual开始,以下值将评估为false:
FALSE
0
和浮动0.0
"0"
)NULL
和未设置的变量鉴于此,当你检查变量是否为 falsy 时,你应该使用not运算符。
对于任何其他条件,您需要明确检查该值。
顺便提一下,if ($_SERVER['HTTPS'] !== 'on') { exit; }
和if (!$_SERVER['HTTPS'] === 'on') { exit; }
完全不同。前者检查$_SERVER['HTTPS']
变量不是否具有值on
。另一方面,后者将$_SERVER['HTTPS']
的值反转,然后将其与on
进行比较,如果它们相等则返回true。
例如,如果$_SERVER['HTTPS']
最初为"off"
(非零字符串,因此,true
)!$_SERVER['HTTPS']
将返回false
,然后进行比较与"on"
。由于false
和"on"
不相等,因此您的if
条件不会被执行。
isset
函数返回一个布尔值,因此完全可以if (!isset($_SESSION)) { session_start(); }
,因为这将检查$_SESSION
是否是假的(将执行if
如果是,则声明。)