0

是否有关于何时使用!=而不是(!condition)检查条件是真还是假的规则或指南?

例如,我有一些页面在返回任何内容之前检查是否启用了 TLS:

if ($_SERVER['HTTPS'] !== 'on') { exit; }

但我也可以这样写:

if (!$_SERVER['HTTPS'] === 'on') { exit; }

对于某些语句,使用后者似乎最干净,例如:

if (!isset($_SESSION)) { session_start(); }

...比同等的短:

if (isset($_SESSION) == false) { session_start(); }

是否有编写这些陈述的标准或指南,或者只是偏好?

注意:我理解 和 之间的区别=====我只是想确保我的代码尽可能清晰简洁。

4

4 回答 4

3

不要这样做:

if (!$_SERVER['HTTPS'] === 'on') { exit; }

!具有比 === 更高的优先级,因此计算结果为:

if ((!$x) === 'on') { ... }

在这种情况下,!$x 会将 $x 转换为布尔值,然后将其反转。所以,如果 $x 里面有任何东西,你最终会得到:

if (false === 'on') { ... }

这永远不会匹配任何 $x 的值。

于 2012-07-28T15:18:29.133 回答
2

我会对此提出异议

if (!$_SERVER['HTTPS'] === 'on') { exit; }

与第一个变体相比,指示性较小,因此可读性较差。

任何时候你有简单的东西

if ($var)

或者

if (!$var)

您正在做的是将传递的值强制为它们的真值/假值。因此,这与以下内容不同:

if ($var === 'on')

这是针对特定比较(而不是其真/假)进行测试。

于 2012-07-28T15:14:51.760 回答
1

好吧,这真的取决于你,但我尽量让事情听起来尽可能接近英语。

你可以说:

If switch is not on then…

或者

If not switch is on then…

我个人会说最上面的那个,所以会编写代码来遵循它。

对于第二种风格,如果事物返回布尔值(即真或假),我从不将其与真或假进行比较,除非您必须使用strpos.

再次想到英语:

If not is set variable…

或者

If is set variable is false…

就个人而言,顶部听起来更好,但当然两者在英语中都不正确。

这个逻辑也有助于命名变量和函数,所以我认为值得考虑。

于 2012-07-28T15:13:22.340 回答
1

not!运算符反转语句。在条件中,它用于检查特定值是否会评估为false。在PHP 手册中,以下值将评估为 false:

  • 布尔值FALSE
  • 整数0和浮点数0.0
  • 一个空字符串一个包含零 ( "0")的字符串
  • 一个空数组
  • NULL和未设置的变量
  • 从空标签创建的 SimpleXML 对象
  • (仅限 PHP 4)具有零变量的对象

鉴于此,当您检查变量是否为falsy时,您应该使用 not 运算符。

对于任何其他情况,您需要明确检查该值。

顺带一提,if ($_SERVER['HTTPS'] !== 'on') { exit; }if (!$_SERVER['HTTPS'] === 'on') { exit; }大不一样。前者检查$_SERVER['HTTPS']变量是否没有on。另一方面,后者将值取反$_SERVER['HTTPS'],然后与它进行比较,on如果它们相等则返回 true。

因此,例如 if $_SERVER['HTTPS']is 最初"off"(一个非零字符串,因此,true!$_SERVER['HTTPS']将返回false,然后将其与"on". 由于false"on"不相等,因此您的if条件将不会被执行。

isset函数返回一个布尔值,因此完全可以这样做,if (!isset($_SESSION)) { session_start(); }因为这将检查是否$_SESSION为假(如果是则执行该if语句)。

于 2012-07-28T15:21:47.817 回答