14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?