为什么在IF()中使用PHP布尔测试时使用一组额外的括号?

时间:2015-03-18 16:18:44

标签: php boolean

对不起,这个问题的标题很奇怪。我找不到一个好的方法来说出来!

这个想法很简单,有时你会看到这样的PHP测试:

if (!a_function("something")) { }

在这里你可以把它想象成“如果不是真的”。我有时看到完全相同的东西,但有额外的parenz:

if (!(a_function("something"))) { }

为什么爆炸后需要额外的parenz?他们俩本质上都不是if (!true)

对于额外的奖励,这两种风格的原因是什么(这有什么名称?),并且可能举例说明如果使用不正确,它们将如何提供替代结果。


更新

以下是我正在使用的PHP脚本中的一个示例,作者正在测试环境变量,并且似乎可以互换地使用这些样式:

if (!(extension_loaded("iconv"))) { ... }
if (!(extension_loaded("xml"))) { ... }
if (!function_exists("json_encode")) { ... }
if (!ini_get("short_open_tag")) { ... }

我知道你不能在这里为程序员回答,但为什么当这些小功能正好相邻时,他们会交替使用额外的parenz? 我碰巧知道,例如,ini_get的返回值只是数字1,而extension_loaded函数的返回值也可能只是数字1,所以似乎没有区别。我不是100%确定除了简单的偏好或操作顺序之外没有其他技巧。

更新2:

我理解parenz可用于清晰度或操作顺序,但我不相信它只是个人偏好。 在上面的例子中,一切都取决于正在测试的函数返回的内容。

我的理解是,通过在parenz中包装一个语句,PHP将强制它成为一个bool。但是当它不在parenz中时,是否有一个返回值会破坏代码而不使用它周围的parenz强制一个bool?

如果有人说,在上面的示例代码中,除了个人偏好之外什么都没有,那么我只需要接受,但我有疑虑。

5 个答案:

答案 0 :(得分:2)

如果有多个逻辑运算符具有不同的优先级,则使用括号,以指示"!"必须在处理完所有其他运算符后应用运算符。例如:

if(!($var1 < $var2)) 

首先检查$ var1是否小于$ var2,然后检查结果是否为false。

如果使用:

if(!$var1 < $var2) 

然后首先检查$ var1是否为false并且结果将与$ var2进行比较,这根本没有意义。

答案 1 :(得分:0)

这不是必需的。这是个人喜好的问题。有时候你喜欢额外的parens来确定如何评估表达式。

 if(a or b and c) 

令人困惑。

 if ((a or b) and c) 

更清楚。

 if(a or (b and c))

更清楚。

答案 2 :(得分:0)

它们都有效,但有些人可能对哪一个更具可读性有不同的看法。

答案 3 :(得分:0)

if( !(should_return_trueA() && should_return_trueB())) {
    // at least one have returned false
}

基本上与:

相同
if( !should_return_trueA() || !should_return_trueB() ) {
    // at least one have returned false
}

在我的情况下,这是一种避免错误/遗漏感叹号的做法。在构建更复杂的条件并寻找全假或全真结果时很有用。

答案 4 :(得分:0)

在给定的情况下不需要括号,但例如,如果您同时分配变量,则可以是括号:

if (($myVar = myFunc()) !== false) {
    // Doing something with $myVar, ONLY if $var is not false
}

虽然在以下情况下,它会改变逻辑

if ($myVar = myFunc() !== false) {
    // Here $myVar = true or false instead of the wanted value
}