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的行為來說有兩種比較方式,像是 ==
以及 ===
,前者是不比較「型態」只比較「數值」,後者是考慮型態。
那,問題來了:
0 == "foo"
0 === "foo"
前者的解答是true
後者的解答是false
,差異在於PHP在有一方是數字的時候,會將兩邊算式的值都做intval
或是floatval
,所以,在任何字串都是0的情況下,兩者一定相等
以上就是兩個在開發上面遇到的坑,如果有新的會再更新上來,感謝各位的收看。