PHP8以降の警告文戻り値の
型チェックが厳格に
へ対応する
all-in-one-wp-migrationを
PHP8以降へ対応させる

image: PHP8以降の警告文戻り値の型チェックが厳格にへ対応する
Handles Return Types

特にall-in-one-wp-migrationでメソッドの戻り値の型に関するエラーが頻発

 | 2024/07/31

PHP 8.1 で新たに厳格な型チェックが導入された

この仕様変更ため戻り値に互換性のある型を宣言していないメソッドの場合、デプリケーション通知が発生するように。
all-in-one-wp-migrationでは下記の警告文がでます。

『Deprecated: Return type of 問題のコード should either be compatible with 戻り値を受け取るクラス名: 推奨の型(boolなど), or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in プログラムの場所

この警告文言には修正方法も一緒に提案されているので、修正は簡単です。
ただし、修正方法は二通り提案されていて、一つ目の方法がお勧めです。
二つ目の修正方法は#[\ReturnTypeWillChange]アトリビュートを使用する一時的なもので結局はもう一度修正しないといけません。

all-in-one-wp-migrationの最新版バージョン 7.84はこのPHP8.1の仕様変更に対応した修正版になりますが、修正方法は二つ目の一時的な方法です。
できればバージョン7.31を一つ目の方法で修正した方が将来的にも安心だと思います。

怪傑CatGPTによる一つ目の解決方法

方法1: 互換性のある型を宣言
下記のように警告文に推奨されている型(この場合はvoid)を戻り値へ宣言。

『Deprecated: Return type of Ai1wm_Recursive_Directory_Iterator::next() should either be compatible with DirectoryIterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in D:\xampp8\htdocs\studio-happyvalley\wp-content\plugins\all-in-one-wp-migration\lib\vendor\servmask\iterator\class-ai1wm-recursive-directory-iterator.php on line 46』

 <? php
public function next(): void {
	parent::next();

	// Skip current and parent directory
	$this->skipdots();
}

怪傑CatGPTによる二つ目の解決方法

方法2: PHP 8.1 以降で導入された `#[\ReturnTypeWillChange]` アトリビュートを使用して、一時的にデプリケーション通知を抑制。
下記のように警告文に二つ目の方法が提案されています。

『Deprecated: Return type of Ai1wm_Recursive_Directory_Iterator::next() should either be compatible with DirectoryIterator::next(): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in D:\xampp8\htdocs\studio-happyvalley\wp-content\plugins\all-in-one-wp-migration\lib\vendor\servmask\iterator\class-ai1wm-recursive-directory-iterator.php on line 46』

<? php
#[\ReturnTypeWillChange]
public function next() {
    parent::next();

    // Skip current and parent directory
    $this->skipdots();
}

all-in-one-wp-migration、お勧めの修正方法はバージョンアップせずに自分で不具合対応する

all-in-one-wp-migration バージョン7.84はphp8.1以降のデプリケーション通知に対応したバージョンになります。
しかし、中身を見てみると二つ目の修正方法で対応しているため一時的なプログラムとなります。
また、このバージョンはバックアップサイズ64MBまでの制限があり、容量アップの対策を施しても、ケースバイケースでバックアップが完了できない不具合もあり、お勧めしません。
できれば容量制限のないバージョン7.31を一つ目の方法でPHP8.1以降用に修正した方が将来的にも安心だと思います。
当然ですが、この方法をとるからには、今後一切バージョンアップはせずに、不具合の修正も自分で続けていく必要があります。

おまけ:PHP のメソッドや関数の戻り値の型として使用できる型一覧。

スカラー型
int: 整数型、float: 浮動小数点数型、string: 文字列型、bool: ブール型(真偽値)
※"double" (歴史的な理由により float の場合は、"float" ではなく、 "double" が返されます)

特殊型
void: 戻り値なし、mixed: 任意の型、null: null 値、false: 明示的に false を返すことを示す(PHP 8.0 以降)、never: 常に例外をスローするかスクリプトを終了する関数(PHP 8.1 以降)

クラス・インターフェース型
任意のクラス名やインターフェース名を指定することができます(例:DateTime、MyClass)。

型の組み合わせ
Type1|Type2: 複数の型のいずれか(ユニオン型、PHP 8.0 以降)、?Type: 特定の型または null を返すことを示す(ヌル許容型)

関数の戻り値の型を確認する方法

PHPで関数の戻り値の型を確認する方法:gettype関数を使用。
型が不明な時は、gettype関数を使って型を調べることができます。

これは変数の型を文字列で返します。
型を調べるだけなら、この方法が簡単かと思います。

function myFunction() {
    return 3.14;
}

$result = myFunction();
echo gettype($result);  // 出力: double

PHPで関数の戻り値の型を確認する方法:Reflection APIの使用
PHPのReflection APIを使うと、関数の戻り値の型情報をプログラム的に取得することができます。以下はその例です:

function someFunction(): array {
    return [1, 2, 3];
}

$reflection = new ReflectionFunction('someFunction');
$returnType = $reflection->getReturnType();

if ($returnType) {
    echo $returnType->getName();  // 出力: array
} else {
    echo 'No return type declared';
}

他にもありますが、上記二つの内のどちらかをケースバイケースで使うのがお勧めです。

警告文をよく見て不具合対応する

『PHP8以降の警告文戻り値の型チェックが厳格にへ対応する』関連のお薦め

このページで紹介しているプログラムやビジュアルなどご依頼いただければ実装を賜ります。
お問い合わせはこちら