プライム・ストラテジー所属の三雲です。
当社では社外活動の一環として勉強会やカンファレンスなどに参加しています。
今回は、『第148回 PHP勉強会@東京』へ参加した際にLT登壇した内容を解説したいと思います。
タイトルは「PHP 7 系と PHP 8 系の違いをラッパー関数を作って確認する」です。
発表内容の解説
PHP バージョン別シェアの現状
PHP 7 系のサポートが切れて1ヶ月以上立っていますが、現状はどうでしょうか?
上記のデータは 2023-01-16 付のデータです。下記ページからの引用となります。最新情報もこちらから確認できます。
[引用] W3Techs: https://w3techs.com/technologies/details/pl-php
PHP 8 系の移行はまだまだ進んでいないのが現状です。
そこで PHP 8 系移行のために PHP 7 で動くでラッパー関数を作って、移行を少しずつ進める準備をしてみましょう。
今回の解説では PHP 8.2 動作環境、ラッパー関数がエミュレートする PHP バージョンは PHP 7.4 を想定しています。
implode ラッパー関数の作成
implode 関数は、PHP 8.0 で引数の書き方に制限ができました。
ラッパー関数を作成するにはちょうどよい教材なので、こちらで解説します。
ということで、次のようなコードを書いてみます。
これでできた!と思いたいところですが、これでは残念ながら不完全です。
ドキュメントでは型を指定されていますが、実際は型指定されていないケースもあります。
大事な点は、ドキュメントに書かれている内容は実際に動作確認することが大切です。
戻り値の型についても同じです。
ラッパー関数に限らず、return できるものは早めに return させます。
名前空間を意識します。
環境により ¥ 円マーク(正しくは半角ですが環境依存しないよう全角で表記)は日本語環境のみです。
正しくは \ バックスラッシュ(正しくは半角ですが環境依存しないよう全角で表記)です。
ラッパー関数の実装
ここまでのまとめで作った関数が以下のようなコードとなります。
function php74_implode(mixed $separator, mixed $array): ?string
{
// 標準関数 implode(string $separator, array $array): string の場合
if (is_string($separator) && is_array($array)) {
return \implode($separator, $array);
}
// 標準関数 implode(array $array): string の場合
if (is_array($separator) && $array === null) {
return \implode($separator);
}
/* これより下は PHP 7.4 に合わせた実装 */
if ($separator === null && is_array($array)) {
return \implode($array);
}
return null;
}
PHP Unit でテストケースを 1,000 ケースくらい用意しました。
PHP 7.4 系ではほとんど null を返すことがわかったので、実際のコードはこの様になりました。
本当はラッパー関数は一時的な間に合せとして使うことが望ましいので、この関数にログを仕込んでおくことが実運用上おすすめです。
少なくとも PHP 7.4 系の処理に移行した箇所にログを仕込んでおくと問題点がわかるでしょう。debug_print_backtrace()
関数などを使うのがおすすめです。
PHP 8 系への移行の一つの方法としてラッパー関数を掘り下げてみました。
引数の型の組み合わせで意外な戻り値を返すケースは存在しますので、正しくテストした上で実装してみてください。
発表の様子
PHP勉強会@東京 では、YouTube チャネルで勉強会の様子が公開されております。
今回の私の発表も公開いただいております。
発表スライド
参考リンク
- PHP勉強会@東京
https://phpstudy.doorkeeper.jp - PHP勉強会@東京 – YouTube チャンネル
https://www.youtube.com/@phpstudy_tokyo