🙌

PHP7環境でPHP8の関数を使う「PHPにもポリフィルってあったんだ」

2023/02/17に公開

この投稿ではタイトルの通りPHP7環境でPHP8の関数が使えるポリフィルについて話します。

PHPでの開発で用意された標準関数群(strposとか)を使うことはよくあると思います。
PHPのバージョンが単一であればあまり問題は発生しませんが、例えばPHP8の環境とPHP7の環境が混在した状況で開発を行なっていると、

  • PHP7の環境でPHP8で実装された関数を誤って使ってしまう
  • 逆に、PHP8の環境でPHP7以前通りの関数を使ってしまう(便利関数の使い漏れ)

が意図せず発生します。

後者の場合はあまり問題になりませんが、前者の場合テストなどすり抜けてしまうと最悪本番環境でエラーとなる可能性があります。

とはいえ、「おっしじゃあ今からPHP7→PHP8に更新するわ!」 というのも無理がありますよね。そんな時に環境の差分を吸収してくれるのがポリフィルです。

ポリフィルとは

ポリフィル、英語で書くとpolyfill。
ググると一番上にMDN用語集が出てくるので抜粋します。

ポリフィルとは、最近の機能をサポートしていない古いブラウザーで、その機能を使えるようにするためのコードです。大抵はウェブ上の JavaScript です。

主にはバージョンの移り変わりとそれによってできることとできないことの差が激しいブラウザの差分を吸収するものという意味合いが強いです。(Babelのpolyfill)

JavaScriptに言及されることが多いpolyfillですが、PHPにもあります。

PHPのポリフィル

symfony/polyfillで公開されています。

symfony/polyfillがサポートするPHP8関数

symfony/polyfillでサポートするPHP8関数を抜粋します。

str_containsstr_starts_withstr_ends_withのような文字チェック系の関数は使いやすいのでこれは助かる!

もちろんPHP8以降の関数を使わなくても同様のことはできますが、わかりやすさという意味ではPHP8関数を積極的に使っていきたいです。

// (例)strposよりstr_containsの方がわかりやすい
$mystring = 'abc';
$findme   = 'a';

// strposで文字列チェックする場合
if (strpos($mystring, $findme) !== false) {
    echo '文字列は含まれる!'
}

// str_containsで文字列チェックする場合
if (str_contains($mystring, $findme)) {
    echo '文字列は含まれる!'
}

導入方法

symfony/polyfillで紹介されている通り、composerで導入できます。

composer.json
{
    "require": {
        "symfony/polyfill-php80": "*",
    }
}

というか何らかのフレームワークで環境を構築する際に、よく見たらデフォで入っているかも。

まとめ

ポリフィルはJavaScriptだけのものじゃない!

ポリフィルっていうとJavaScript関連のものって印象がありましたが、PHPにもあったんですね(無知)

PHPの開発で標準関数を使うときは、見慣れない(新しい)ものは対応PHP Versionを確認してから使っています。
なので基本的にはPHP Version準拠の関数しか使わないのですが、最近PHP8環境とPHP7環境の両方で開発しているのでどうしてもPHP7環境にPHP8の追加関数が混ざり込みます(人間だもの)

そんなとき実行エラーにならず「あれ?」って思ったので改めて確認した次第です。

人知れず裏側で僕たちを助けてくれていたんだねPHPたん・・・ありがとう・・・

Discussion