在PHP中是否有使用!=而不是(!condition)的指导原则?

时间:2012-07-28 15:08:25

标签: php

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

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

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

但我也可以这样写:

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

对于某些陈述,使用后者似乎最简洁,例如:

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

...比等效物短:

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

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

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

4 个答案:

答案 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和未设置的变量
  • 从空标签创建的SimpleXML对象
  • (仅限PHP 4)具有零变量的对象

鉴于此,当你检查变量是否为 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如果是,则声明。)