登壇発表してきました!

PHP勉強会@東京にてLT登壇発表 「PHP 7 系と PHP 8 系の違いをラッパー関数を作って確認する」

PHP

三雲勇二

「PHP 7系とPHP 8系の違いを理解し、移行を助けるためのラッパー関数作りを試みる」という内容を三雲氏が第148回PHP勉強会で発表した。PHP 8系への移行が進んでいない状況の中、PHP 7で作動するラッパー関数を作成することで、移行を段階的に進める方法を提案し、実際に「implode」ラッパー関数の作成からテストまでの実装過程を詳細に解説した。発表内容はYouTubeでも公開されている。

プライム・ストラテジー所属の三雲です。
当社では社外活動の一環として勉強会やカンファレンスなどに参加しています。

今回は、『第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 で引数の書き方に制限ができました。
ラッパー関数を作成するにはちょうどよい教材なので、こちらで解説します。

[引用] PHP Documentation: https://www.php.net/manual/ja/function.implode.php

ということで、次のようなコードを書いてみます。

これでできた!と思いたいところですが、これでは残念ながら不完全です。

ドキュメントでは型を指定されていますが、実際は型指定されていないケースもあります。
大事な点は、ドキュメントに書かれている内容は実際に動作確認することが大切です。

戻り値の型についても同じです。

ラッパー関数に限らず、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 チャネルで勉強会の様子が公開されております。
今回の私の発表も公開いただいております。

第148回 PHP勉強会@東京 発表部分

発表スライド

参考リンク

関連記事

Webサイト運用の課題解決事例100選 プレゼント

Webサイト運用の課題を弊社プロダクトで解決したお客様にインタビュー取材を行い、100の事例を108ページに及ぶ事例集としてまとめました。

・100事例のWebサイト運用の課題と解決手法、解決後の直接、間接的効果がわかる

・情報通信、 IT、金融、メディア、官公庁、学校などの業種ごとに事例を確認できる

・特集では1社の事例を3ページに渡り背景からシステム構成まで詳解