こんにちは、システム開発事業部のイマイです。
本記事では、AL2023対応に伴い、PHPのバージョンを8.0から8.2にアップグレードする必要があったため、FuelPHP 1.8.2をPHP8.2に対応させるために行った修正内容と、発生した互換性の問題についてまとめています。
なお、ここで紹介する内容は実際に発生したエラーを基に記述しているため、すべてのケースを網羅しているわけではありません。あらかじめご了承ください。
修正内容
strtoupper()引数エラー:Database\Query\Builderクラス
エラー内容
1Runtime Deprecated code usage - strtoupper(): Passing null to parameter #1 ($string) of type string is deprecated in /app/fuel/core/classes/database/query/builder.php on line 198
対応
PHP8.1以降、strtoupperの引数にnullを渡すのは非推奨となったため、nullの代わりに空文字を渡すよう修正する。
1// Before
2$direction = strtoupper($direction);
3
4// After
5$direction = strtoupper($direction ?? '');
strstr()引数エラー:Input\Instanceクラス
エラー内容
1Runtime Deprecated code usage - strstr(): Passing null to parameter #1 ($haystack) of type string is deprecated in /app/fuel/core/classes/input/instance.php on line 451
対応
PHP8.1以降、strstrの引数にnullを渡すのは非推奨となったため、nullの代わりに空文字を渡すよう修正する。
1// Before
2if (($content_type = strstr($content_header, ';', true)) === false)
3
4// After
5if (($content_type = strstr($content_header ?? '', ';', true)) === false)
strstr()引数エラー:Request\Driverクラス
エラー内容
1Runtime Deprecated code usage - strstr(): Passing null to parameter #1 ($haystack) of type string is deprecated in /app/fuel/core/classes/request/driver.php on line 369
対応
PHP8.1以降、strstrの引数にnullを渡すのは非推奨となったため、nullの代わりに空文字を渡すよう修正する。
1// Before
2$mime = strstr($mime, ';', true) ?: $mime;
3
4// After
5$mime = strstr($mime ?? '', ';', true) ?: $mime;
http_build_query()引数エラー:Request\Curlクラス
エラー内容
1Runtime Deprecated code usage - http_build_query(): Passing null to parameter #2 ($numeric_prefix) of type string is deprecated in /app/fuel/core/classes/request/curl.php on line 358
対応
PHP8.1以降、http_build_queryの引数にnullを渡すのは非推奨となったため、nullの代わりに空文字を渡すよう修正する。
1// Before
2return http_build_query($input, null, '&');
3
4// After
5return http_build_query($input, '', '&');
setcookie()引数エラー:Cookieクラス
エラー内容
1Runtime Deprecated code usage - setcookie(): Passing null to parameter #2 ($value) of type string is deprecated in /app/fuel/core/classes/cookie.php on line 100
対応
PHP8.1以降、setcookieの引数にnullを渡すのは非推奨となったため、nullの代わりに空文字を渡すよう修正する。
1// Before
2return setcookie($name, $value, $expiration, $path, $domain, $secure, $http_only);
3
4// After
5return setcookie($name, $value, $expiration, $path, $domain ?? '', $secure, $http_only);
str_replace()引数エラー:Formatクラス
エラー内容
1Runtime Deprecated code usage - str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in /app/fuel/core/classes/format.php on line 243
対応
PHP8.1以降、str_replaceの引数にnullを渡すのは非推奨となったため、nullの代わりに空文字を渡すよう修正する。
1// Before
2$item = $enclosure.str_replace($enclosure, $escape.$enclosure, $item).$enclosure;
3
4// After
5$item = $enclosure.str_replace($enclosure, $escape.$enclosure, $item ?? '').$enclosure;
filter_var()引数エラー:Inputクラス
エラー内容
1Runtime Deprecated code usage - filter_var(): Passing null to parameter #3 ($options) of type array|int is deprecated in /app/fuel/core/classes/input.php on line 122
対応
PHP8.1以降、filter_varの引数にnullを渡すのは非推奨となったため、nullの代わりにfalseを渡すよう修正する。
1// Before
2return filter_var($ip, FILTER_VALIDATE_IP, $exclude_reserved ? FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE : null);
3
4// After
5return filter_var($ip, FILTER_VALIDATE_IP, $exclude_reserved ? FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE : false);
str_replace()引数エラー:Uriクラス
エラー内容
1Runtime Deprecated code usage - str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /app/fuel/core/classes/uri.php on line 195
対応
PHP8.1以降、str_replaceの引数にnullを渡すのは非推奨となったため、nullの代わりに空文字を渡すよう修正する。
1// Before
2$url = str_replace(':'.$key, $val, $url);
3
4// After
5$url = str_replace(':'.$key, $val ?? '', $url);
static使用非推奨エラー:Securityクラス
エラー内容
1Runtime Deprecated code usage - Use of "static" in callables is deprecated in /app/fuel/core/classes/security.php on line 148
対応
PHP8.1以降、PHPの呼び出し可能オブジェクト(callables)でのstaticキーワードの使用が非推奨となったため、該当箇所のstaticの記述を削除する。
1// Before
2if (is_string($filter) and is_callable('static::'.$filter))
3{
4 $var = static::$filter($var);
5}
6
7// After
8if (is_string($filter) and is_callable($filter))
9{
10 $var = $filter($var);
11}
strftime()非推奨エラー:Dateクラス
エラー内容
1Runtime Deprecated code usage - Function strftime() is deprecated in /app/fuel/core/classes/date.php on line 348
対応
PHP8.1以降、strftime関数は非推奨となったため、date関数に置き換える。
1// Before
2$output = strftime($pattern, $this->timestamp);
3
4// After
5$pattern = str_replace(
6 ['%Y', '%m', '%d', '%H', '%M', '%S'],
7 ['Y', 'm', 'd', 'H', 'i', 's'],
8 $pattern
9);
10$output = date($pattern, $this->timestamp);
Countableインターフェース対応エラー:Database関連クラス
1Runtime Deprecated code usage - Return type of Fuel\\Core\\Database_Result::count() should either be compatible with Countable::count(): int, or the #[\\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /app/fuel/core/classes/database/result.php on line 245
対応
PHP8.1以降、Countable, Iterator, ArrayAccessインターフェースなどを継承した場合は、メソッド戻り値の型指定がないと警告が出るため、該当メソッドに #[\ReturnTypeWillChange] を付与する。
fuel/core/classes/database/result.php
1#[\ReturnTypeWillChange]
2public function count()
3
4#[\ReturnTypeWillChange]
5public function current()
6
7#[\ReturnTypeWillChange]
8public function key()
9
10#[\ReturnTypeWillChange]
11public function next()
12
13#[\ReturnTypeWillChange]
14public function rewind()
15
16#[\ReturnTypeWillChange]
17public function valid()
fuel/core/classes/database/pdo/result.php
1#[\ReturnTypeWillChange]
2public function next()
fuel/core/classes/database/pdo/cached.php
1#[\ReturnTypeWillChange]
2public function seek($offset)
3
4#[\ReturnTypeWillChange]
5public function current()
6
7#[\ReturnTypeWillChange]
8public function next()
9
10#[\ReturnTypeWillChange]
11public function offsetExists($offset)
12
13#[\ReturnTypeWillChange]
14public function offsetGet($offset)
15
16#[\ReturnTypeWillChange]
17final public function offsetSet($offset, $value)
18
19#[\ReturnTypeWillChange]
20final public function offsetUnset($offset)
ArrayAccessインターフェース対応エラー:Upload関連クラス
エラー内容
1Runtime Deprecated code usage - Return type of Fuel\\Upload\\Upload::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /app/fuel/vendor/fuelphp/upload/src/Upload.php on line 503
対応
PHP8.1以降、Countable, Iterator, ArrayAccessインターフェースなどを継承した場合は、メソッド戻り値の型指定がないと警告が出るため、該当メソッドに #[\ReturnTypeWillChange] を付与する。
fuel/vendor/fuelphp/upload/src/Upload.php
1#[\ReturnTypeWillChange]
2public function count()
3
4#[\ReturnTypeWillChange]
5public function offsetExists($offset)
6
7#[\ReturnTypeWillChange]
8public function offsetGet($offset)
9
10#[\ReturnTypeWillChange]
11public function offsetSet($offset, $value)
12
13#[\ReturnTypeWillChange]
14public function offsetUnset($offset)
15
16#[\ReturnTypeWillChange]
17public function rewind()
18
19#[\ReturnTypeWillChange]
20public function current()
21
22#[\ReturnTypeWillChange]
23public function key()
24
25#[\ReturnTypeWillChange]
26public function next()
27
28#[\ReturnTypeWillChange]
29public function valid()
fuel/vendor/fuelphp/upload/src/File.php
1#[\ReturnTypeWillChange]
2public function count()
3
4#[\ReturnTypeWillChange]
5public function offsetExists($offset)
6
7#[\ReturnTypeWillChange]
8public function offsetGet($offset)
9
10#[\ReturnTypeWillChange]
11public function offsetSet($offset, $value)
12
13#[\ReturnTypeWillChange]
14public function offsetUnset($offset)
15
16#[\ReturnTypeWillChange]
17function rewind()
18
19#[\ReturnTypeWillChange]
20function current()
21
22#[\ReturnTypeWillChange]
23function key()
24
25#[\ReturnTypeWillChange]
26function next()
27
28#[\ReturnTypeWillChange]
29function next()
30
31#[\ReturnTypeWillChange]
32function valid()
ArrayAccessインターフェース対応エラー:Orm\Classes/Modelクラス
エラー内容
1Runtime Deprecated code usage - Return type of Orm\Model::offsetExists($offset) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /app/fuel/packages/orm/classes/model.php on line 2145
対応
PHP8.1以降、Countable, Iterator, ArrayAccessインターフェースなどを継承した場合は、メソッド戻り値の型指定がないと警告が出るため、該当メソッドに[\ReturnTypeWillChange] を付与する。
1#[\ReturnTypeWillChange]
2public function offsetSet($offset, $value)
3
4#[\ReturnTypeWillChange]
5public function offsetExists($offset)
6
7#[\ReturnTypeWillChange]
8public function offsetUnset($offset)
9
10#[\ReturnTypeWillChange]
11public function offsetGet($offset)
12
13#[\ReturnTypeWillChange]
14public function rewind()
15
16#[\ReturnTypeWillChange]
17public function current()
18
19#[\ReturnTypeWillChange]
20public function key()
21
22#[\ReturnTypeWillChange]
23public function next()
24
25#[\ReturnTypeWillChange]
26public function valid()
未定義プロパティエラー:Cryptクラス
エラー内容
1Runtime Deprecated code usage - Creation of dynamic property Fuel\\Core\\Crypt::$legacy_crypter is deprecated in /app/fuel/core/classes/crypt.php on line 438
2
3Runtime Deprecated code usage - Creation of dynamic property Fuel\\Core\\Crypt::$legacy_hasher is deprecated in /app/fuel/core/classes/crypt.php on line 439
対応
PHP8.2以降、オブジェクトに対し、未定義のプロパティへの値の設定が非推奨となったため、プロパティの初期値を定義する。
1// 追記
2public $legacy_crypter;
3public $legacy_hasher;
未定義プロパティエラー:Controller\Restクラス
エラー内容
1Runtime Deprecated code usage - Creation of dynamic property Fuel\\Core\\Request::$body is deprecated in /app/fuel/core/classes/controller/rest.php on line 76
対応
PHP8.2以降、オブジェクトに対し、未定義のプロパティへの値の設定が非推奨となったため、プロパティの初期値を定義する。
fuel/core/classes/request.php
1// 追記
2public $body;
3public $lang;
fuel/core/classes/controller.php
1// 追記
2public $response;
マイグレーションテーブル未検出エラー:Database\Mysqli\Connectionクラス
エラー内容
1Uncaught exception mysqli_sql_exception: 1146 - Table 'projects.migration' doesn't exist in /app/fuel/core/classes/database/mysqli/connection.php on line 293
対応
マイグレーション実行時のエラーでmigrationテーブルが見つからないというエラー。
以下の2ファイルをfuel/core1.9からコピペする。
さらにconnection.phpの__construct内に以下のコードを追記。
1// 追記
2mysqli_report(MYSQLI_REPORT_OFF);
終わりに
以上が、AL2023対応に向けてPHP8.0から8.2へバージョンアップを行った際に、FuelPHPを対応させるために行った修正内容です。
移行作業の際には、ご自身の環境に応じた追加の対応が必要になる場合がありますが、同様のエラーに直面している方の助けになれば幸いです。