[筆記]幾個PHP上面常踩的雷

PHP距今到現在已經有20多年的歷史了,每一代的PHP的特性也不太一樣,像是今年開始穩定的PHP7就跟PHP5有著滿明顯差異,接下來的部份是會稍微提一下幾個必須注意的雷(一部份是PHP5轉PHP7一部份是原生的),各位在開發的過程中請多加小心。

foreach

在PHP5中foreach的行為模式會去做指針的移動,像是:

$foo = [1, 2, 3];

foreach($foo as $bar) {
    var_dump(current($foo));
}

出來的結果會是

int(1)
int(2)
int(3)

由上述的答案我們可以知道經過一次foreach,在foo的指針就會做對應的移動

那PHP7呢?
在PHP7中,一樣的code我們會得到這樣的答案

int(1)
int(1)
int(1)

造成兩個不一樣的原因主要是因為在PHP7的行為中,每一次的foreach都會去完整複製,所以指針並不會移動,每次print出來的值當然就是一樣的了

另外還有參照的修改,也請儘量避免這樣的用法 來源

<?php

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)

// without an unset($value), $value is still a reference to the last item: $arr[3]

foreach ($arr as $key => $value) {
    // $arr[3] will be updated with each value from $arr...
    echo "{$key} => {$value} ";
    print_r($arr);
}
// ...until ultimately the second-to-last value is copied onto the last value

// output:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

comparison

PHP的行為來說有兩種比較方式,像是 == 以及 ===,前者是不比較「型態」只比較「數值」,後者是考慮型態。

那,問題來了:

  1. 0 == "foo"
  2. 0 === "foo"

前者的解答是true後者的解答是false,差異在於PHP在有一方是數字的時候,會將兩邊算式的值都做intval或是floatval,所以,在任何字串都是0的情況下,兩者一定相等

以上就是兩個在開發上面遇到的坑,如果有新的會再更新上來,感謝各位的收看。