TL;DR
- PHP5.5からpreg_replaceのe修飾子はDEPRECATED扱いとなっていたが、一応動いてはいた。
- PHP7では、preg_replaceのe修飾子を使うと、Warningを吐きつつNULLを返す。
- PHP5.5時代にpreg_replaceに
@
を書いてお茶を濁した人は、PHP7で地雷を踏む。
解説
このコードをご覧ください。
a.php
$string = "hello world";
$string2 = preg_replace('/(world)/e', "strtoupper('\$1')", $string);
var_dump($string2);
"hello world"のうちの"world"を大文字に変換するコードです。
PHP5.5/5.6の場合
php5.5やPHP5.6だと実行結果はこうなります。
PHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /Users/DQNEO/a.php on line 3
string(11) "hello WORLD"
Deprecatedが出つつも、ちゃんと適用されて"world"が大文字の"WORLD"になります。
PHP7.0.0alpha1の場合
a.php
PHP Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /Users/DQNEO/a.php on line 3
NULL
おわかりでしょうか。
戻り値がNULLに変わっています。
@でお茶を濁してた人は致命的バグになる
PHP5.5時代に、「Deprecatedが出なければそれでいいや」と考えて
@preg_replace
と頭に@
をつけてごまかした人は、PHP7時代になるとWarningが出ないまま戻り値がNULLに変わってしまうので、わかりにくいバグの原因になることでしょう。
まとめ
preg_replace_callback使え