FuelPHPのPHP8.1対応(無理矢理編)
皆さん、PHPのフレームワークは何を使っていますか?今から学ぶなら「Laravel」や昔ながらの「CakePHP」でしょうか?
私は数年前から「FuelPHP」というフレームワークを使っていて「なんて開発しやすいんだ」と感動した記憶があります。
ところが、FuelPHPのリリースがピタッと止まり、PHPのバージョンアップに対して暗雲が立ちこめてきました。
てかフレームワークの選定ミスはかなり痛いですね。私は先物取引には金輪際手を出しません。
幸いPHP7に関しては問題なくできたのですが、時代はPHP8.1になり、ここでついにエラーが出るようになってしまいました。
参考 【PHP8.1】PHP8.1で削除される機能
https://qiita.com/rana_kualu/items/c894b2160d1f8799eed2#key-current-next-prev-and-reset-on-objects
ここに詳しく書いていますが「オブジェクトに対するkey(), current(), next(), prev(), reset() を非推奨とする」ようです。
本来であればFuelPHPのアップデートで修正してもらえるはずですが、そんなはずもなく…
公式がやってくれなきゃ自分でやるしかないって事で、該当箇所の確認および修正を行うことにしました。
結論から言うと、該当箇所の直前に
#[\ReturnTypeWillChange]
をつければ(とりあえずは)いいだけです。
例えば
fuel\core\classes\database\result.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/************************** * Countable methods *************************/ /** * Implements [Countable::count], returns the total number of rows. * * echo count($result); * * @return integer */ public function count() { return $this->_total_rows; } |
を
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/************************** * Countable methods *************************/ /** * Implements [Countable::count], returns the total number of rows. * * echo count($result); * * @return integer */ #[\ReturnTypeWillChange] // ← 追加 public function count() { return $this->_total_rows; } |
こういう感じで関数の前に入れるだけでとりあえず大丈夫になります。
検索で「public function count()」や「public function current()」で検索して片っ端から貼り付けてもいいと思います。
ただ\fuel\coreを直接いじるので、もしcomposerでアップデートした場合は書き換わる可能性もあるかもしれないですね。
私は試してませんが該当ファイルを\fuel\app\にコピーしてそこで上記の処理をやればいいのかもという気もしますが、誰か試してもらえると…
SmartyのPHP8.1対応
ちなみにSmartyも地味にPHP8.1の影響を受けていました。ほとんどにおいては大丈夫なのですが、テンプレートで[date_format]を使う場合に影響が出ています。
参考 【PHP8.1】PHP8.1で削除される機能
https://qiita.com/rana_kualu/items/c894b2160d1f8799eed2#strftime-and-gmtstrftime
こちらにも記載されてますが「このRFCでは、strftimeとgmtstrftimeを非推奨とします」となっているため、Smartyの該当部分を変更しないとダメですね。
一番いいのはdate_formatを使わないことまたは第4引数に”auto”または”strftime”以外を入れるのがいいですが、影響範囲がわからないので、大本の関数を改修しましょう。
Smarty\libs\plugins\modifier.date_format.php
1 2 3 4 |
- return strftime($format, $timestamp); + // #PHP8.1対応 strftime → date + $format = preg_replace('/\%/', '', $format); + return date($format, $timestamp); |
わかりづらいですが、strftime関数をdate関数に書き換えています。
ただstrftime関数では”%Y-%m-%d”でしたが date関数は”Y-m-d”なので直前で削除しています。
単純な日付や時間はこれでいけると思いますがそれ以外のものは要検証ですね
最後に
以上が無理矢理な対応法ですが、もちろんこれは正攻法でも何でもなく、本当はそれぞれが対応するバージョンアップするのが一番だと思います。とはいえ、とりあえず動くための何らかのレシピの一つになればと言うことで敢えてまとめました。
あと「このやり方でやったけど動かなくなったぞ」と言われても私は「災難でしたなー」としか言えないので十分に検証した上で試してみてください。
最後に私からの一言。
「意地張らずにLaravel使おうぜ!」
それではまた…