我有一个代码库,开发人员决定使用AND和OR,而不是&&和||。
我知道运算符的优先级是不同的(&&在和之前),但对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。
你用的是哪个版本?and比&&更易读?还是没有区别?
我有一个代码库,开发人员决定使用AND和OR,而不是&&和||。
我知道运算符的优先级是不同的(&&在和之前),但对于给定的框架(准确地说是PrestaShop),这显然不是一个原因。
你用的是哪个版本?and比&&更易读?还是没有区别?
当前回答
这里有一个小反例:
$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);
输出:
bool(false)
我想说的是,这种打字错误更有可能导致潜在的问题(与= vs ==相同),而且比adn/ro打字错误更不容易被注意到,后者会被标记为语法错误。我还发现and/or更容易阅读。总之,大多数PHP框架表达了首选项(大多数没有)指定and/or。我也从来没有遇到过一个真实的、不做作的情况,在这种情况下它会很重要。
其他回答
如果你使用AND和OR,你最终会被这样的东西绊倒:
$this_one = true;
$that = false;
$truthiness = $this_one and $that;
想猜猜$truthiness等于什么吗?
如果你说错…对不起,错了!
上面的$truthiness值为true。为什么?=的优先级高于and。添加括号来显示隐式顺序,使其更清晰:
($truthiness = $this_one) and $that
如果在第一个代码示例中使用&&而不是and,那么它将像预期的那样工作,结果为false。
正如下面评论中讨论的那样,这也可以获得正确的值,因为括号的优先级高于=:
$truthiness = ($this_one and $that)
我想这是一个品味问题,尽管(错误地)把它们混在一起可能会导致一些不受欢迎的行为:
true && false || false; // returns false
true and false || false; // returns true
因此,使用&&和||更安全,因为它们具有最高优先级。在可读性方面,我想说这些操作符是足够通用的。
更新:关于评论说,这两个操作返回false…好吧,事实上上面的代码没有返回任何东西,我很抱歉歧义。澄清一下:第二种情况下的行为取决于如何使用操作的结果。观察一下这里操作符的优先级是如何发挥作用的:
var_dump(true and false || false); // bool(false)
$a = true and false || false; var_dump($a); // bool(true)
$a === true的原因是因为赋值操作符优先于任何逻辑操作符,这在其他回答中已经很好地解释了。
另一个使用if语句不带=赋值操作的好例子。
if (true || true && false); // is the same as:
if (true || (true && false)); // TRUE
and
if (true || true AND false); // is the same as:
if ((true || true) && false); // FALSE
因为AND的优先级较低,所以||的优先级较高。
这些在真假假和真假的情况下是不同的。 详细示例见https://ideone.com/lsqovs。
根据使用方式的不同,它可能是必要的,甚至是方便的。 http://php.net/manual/en/language.operators.logical.php
// "||" has a greater precedence than "or"
// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;
// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
但在大多数情况下,这似乎更像是开发人员的口味,就像我在@Sarfraz提到的CodeIgniter框架中看到的每一次这种情况。
这里有一个小反例:
$a = true;
$b = true;
$c = $a & $b;
var_dump(true === $c);
输出:
bool(false)
我想说的是,这种打字错误更有可能导致潜在的问题(与= vs ==相同),而且比adn/ro打字错误更不容易被注意到,后者会被标记为语法错误。我还发现and/or更容易阅读。总之,大多数PHP框架表达了首选项(大多数没有)指定and/or。我也从来没有遇到过一个真实的、不做作的情况,在这种情况下它会很重要。