PHP5.6.18以上にアップデートすると、freo(smarty)で『preg_replace();・・・』エラー

freo Ver 1.19.3 を利用中、PHPのバージョンを 5.6.18 にアップデートすると、以下のエラーメッセージが出るようになった。

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/*****/freo/libs/smarty/Smarty_Compiler.class.php on line 270

このエラー内容は、

e (PREG_REPLACE_EVAL)
警告
この機能は PHP 5.5.0 で非推奨になります。この機能に頼らないことを強く推奨します。
この非推奨の修飾子を設定すると、preg_replace() は、置換文字列において後方参照に関する通常の置換を行った後、PHPコードとして評価し、検索文字列を置換するためにその結果を使用します。置換された後方参照においては、単引用符や二重引用符、バックスラッシュ (\)および NULL 文字はバックスラッシュでエスケープされます。

ようわからんが、preg_replace()は、非推奨だから使うな!ってこと。

エラーが出ているのは『/freo/libs/smarty/Smarty_Compiler.class.php』の270行目あたりということなので、確認してみると以下のコードが。

$source_content = preg_replace($search.'e', "'"
. $this->_quote_replace($this->left_delimiter) . 'php'
. "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
. $this->_quote_replace($this->right_delimiter)
. "'"
, $source_content);

調べてみますと、smarty公式サイトのフォーラムにドンピシャの解決コードがありました。

$source_content = preg_replace_callback($search, create_function ('$matches', "return '"
     . $this->_quote_replace($this->left_delimiter) . 'php'
     . "' . str_repeat(\"\n\", substr_count('\$matches[1]', \"\n\")) .'"
     . $this->_quote_replace($this->right_delimiter)
     . "';")
     , $source_content);

ちなみにこの不具合は、freoではなく、あくまでも『smarty』に問題アリというものです。

また、php.iniの『display_errors』を『On』にしていたから分かりましたが、そうでなければ、エラーに気付くことはなかってでしょう。

Web制作覚書