Letter Logical Bug

PHP offers two sets of operators for logical operations: the letter operators, and, or, xor, and the symbol operators, &&, ||, no xor in symbol.

While they do the same, those operators have a difference: they do not share the same precedence. In particular, && has higher priority than = while = has higher priority than and. This leads to a difference in execution.

When combining = and &&, the logical operation happens before the assignation. While combining = and and actually ignore the logical operation.

The same problem affect yield, yield from, print, all assignations, including the short assignations, the ternary operator and the null-coalesce.

It is recommended to always use the symbol logical operators, which is closer to human expectations.

<?php

    $a = 1 && 3;

    $b = 1 and 3;
    // equivalent to
    ($b = 1) and 3;

    var_dump($a); // true
    var_dump($b); // 1

?>

Documentation

See also Understanding the Crucial Difference: &&/|| vs. and/or in PHP.

Related : Bitwise Operators, Logical Operators