很抱歉,这个问题的标题很奇怪。我找不到一个好的表达方式!
这个想法很简单,有时你会看到PHP测试是这样的:
if (!a_function("something")) { }
在这里,你可以把它想象成"如果不是真的"。我有时看到完全相同的东西,但有额外的透明度:
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来强制布尔?
在我上面的示例代码中,如果人们说除了个人偏好之外什么都没有,那么我只能接受这一点,但我对此表示怀疑。
如果有多个具有不同优先级的逻辑运算符,则会使用括号,以指示在处理完所有其他运算符后必须应用"!"运算符。例如:
if(!($var1 < $var2))
如果$var1小于$var2,将首先检查,然后如果结果为false,将检查。
如果使用:
if(!$var1 < $var2)
然后将首先检查$var1是否为false,并将结果与$var2进行比较,这根本没有意义。
这不是必需的。这是个人喜好的问题。有时,您希望有额外的parens来确定表达式的求值方式。
if(a or b and c)
令人困惑。
if ((a or b) and c)
更加清晰。
if(a or (b and c))
更加清晰。
它们都有效,但有些人可能对哪一个更可读有不同的看法。
在给定的情况下不需要圆括号,但如果您同时分配一个变量,则可以使用圆括号:
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
}
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
}
就我而言,这是一种避免错用感叹号的做法。当构建更复杂的条件并寻找全假或全真结果时,这很有用。