hero_picture
Cover Image for FuelPHP 1.8.2をPHP8.0からPHP8.2に対応させる

FuelPHP 1.8.2をPHP8.0からPHP8.2に対応させる

2024/12/16

こんにちは、システム開発事業部のイマイです。

本記事では、AL2023対応に伴い、PHPのバージョンを8.0から8.2にアップグレードする必要があったため、FuelPHP 1.8.2PHP8.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を対応させるために行った修正内容です。

移行作業の際には、ご自身の環境に応じた追加の対応が必要になる場合がありますが、同様のエラーに直面している方の助けになれば幸いです。