PHP 中&有两种用法, 而&&只有一种.

1. &&

&&的用法只有一种, 就是逻辑与, 相当于and, 例:

if (true && false) {
   // do something 
}

2. &

&主要用法有二:

引用
function suffix(&$str) {
    $str .= '_suffix';
}

$test = 'test';

suffix($test);

echo $test; // 'test_suffix'

相比较:

function suffix($str) {
    return $str .= '_suffix';
}

$test = 'test';

$result = suffix($test);

echo $test; // 'test'
echo $result; // 'test_suffix'
位与
$test = 2 & 3; // 10 & 11 = 10

printf('%d', $test); // 2

&&&有一些比较好玩的现象, 观察以下代码:

$conditionA = true;
$conditionB = true;
$conditionC = false;

if ($conditionA && $conditionB) {
    echo 'ok';
}

if ($conditionA & $conditionB) {
    echo 'ok';
}

if ($conditionC && $conditionB) {
    // unreachable
}

if ($conditionC & $conditionB) {
    // unreachable
}

$i = 1; // 01
$j = 2; // 10

// (bool)1 && (bool)2 = true && true = true
if ($i && $j) {
    echo 'ok';
}

// 01 & 10 = 00 = false
if ($i & $j) {
    // unreachable
}

// $i++ is unreachable!
if (false && $i++) {
    // unreachable
}

echo $i; // 1

// $i++ is reachable!
if (false & $i++) {
    // unreachable
}

echo $i; // 2

前 4 个条件语句看起来&可以起到与&&相同的作用, 但从后面 4 个条件语句, 可以发现其中的差别. 不过, 如果能坚定地把&当作位与运算思考, 就没什么奇怪的了. 另外, 以上例子还给我们这样的经验:

  • 不要把&&&用;
  • 不要在条件语句中改变变量值