PHP

PHP7でpreg_replaceのe修飾子の挙動が変わるので要注意です。

More than 3 years have passed since last update.


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使え