PHP8.1とSmarty4.1.0のdate_format修飾子
2022年03月08日 21:43
PHP8.1でSmarty4.1.0のdate_format修飾子を使用した場合にDeprecatedエラーが発生しました。
Deprecated: Function strftime() is deprecated in /home/xxxxxx/public_html/xxxxxx/library/smarty4/libs/plugins/modifier.date_format.php on line 81
原因
- strftime()がPHP8.1より非推奨になった。
- date_format修飾子の日付/時間のフォーマット指定によってはstrftime()が動作する。
結論
日付/時間のフォーマットをdate()のものに変更することにより、date_format修飾子内でstrftime()が動作することを回避します。
「2022年03月07日 20:10」という表記をする場合は以下のとおりです。
まずはstrftime()のフォーマット。この記述ではDeprecatedエラーが発生します。
{$datetime|date_format:'%Y年%m月%d日 %H:%M'}
これをdate()のフォーマットに変更します。
{$datetime|date_format:'Y年m月d日 H:i'}
※$datetimeにはUNIXタイムスタンプが格納されているとします。
これでDeprecatedエラーが発生しなくなりました。
解説
"libs/plugins/modifier.date_format.php"のソースコードを確認すると、51行目でフォーマットによる分岐があります。
if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) { if (Smarty::$_IS_WINDOWS) { /* --- ※省略 :: Windows環境向け処理 --- */ } return strftime($format, $timestamp); } else { return date($format, $timestamp); }
$formatに「%」が含まれる場合にstrftime()が動作、含まれない場合にdate()が動作するようになっているようです。$formatterは通常省略する変数なので自動的に「auto」が格納されていると考えて良いでしょう。
Smarty公式ドキュメントでは、strftime()のフォーマットを使用するように解説されているため、実は「date()のフォーマットも使える」というのはほぼ裏ワザではないかと感じました。これは実装部分を見てみないと分かりませんね。(´・ω・)