Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP勉強会@東京 (第148回) - PHP 7 系と PHP 8 系の違いをラッパー関数を...

Mikumo
February 01, 2023

PHP勉強会@東京 (第148回) - PHP 7 系と PHP 8 系の違いをラッパー関数を作って確認する

Mikumo

February 01, 2023
Tweet

More Decks by Mikumo

Other Decks in Programming

Transcript

  1. @maikeru (mikumo) 自己紹介✍ 三雲 勇二 / mikumo プライム・ストラテジー株式会社 所属 ・KUSANAGI

    / WEXAL (WordPress などフレームワーク高速化) ・ハイパーオートメーション (自動化やAIなど) ・PRIME STUDY (PHPの模擬試験あります) PHP技術者認定機構 エバンジェリスト ・PHP試験のコラムを毎月書いてます ・来年春公開予定の新試験「PHP8初級」の監修
  2. @maikeru (mikumo) implode 関数 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php 1. implode(string

    $separator, array $array): string 2. implode(array $array): string 3. implode(array $array, string $separator): string
  3. @maikeru (mikumo) implode 関数の PHP 8.0 変更点 § PHP Documentation:

    https://www.php.net/manual/ja/migration80.incompatible.php ($pieces, $glue) のような形で、 implode() 関数を逆の引数の順番で呼ぶ ことはサポートされなくなりました。
  4. @maikeru (mikumo) implode 関数 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php 1. implode(string

    $separator, array $array): string 2. implode(array $array): string 3. implode(array $array, string $separator): string 3番目の書き方は PHP 8.0 で廃止
  5. @maikeru (mikumo) implode ラッパー関数 function php74_implode($separator, $array) { // implode($array,

    $separator) 対応 if (is_string($array) && is_array($separator)) { return implode($array, $separator); } return implode($separator, $array); }
  6. @maikeru (mikumo) 問題 1 : 引数の型 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php

    PHP 7 系までは引数の型は特に指定されていません。 implode($separator, $array) PHP 8 系は引数の型がチェックされるように書いています。 (が、実はそうでもないです。) implode(string $separator, array $array): string
  7. @maikeru (mikumo) 問題 2 : 戻り値の型 § PHP Documentation: https://www.php.net/manual/ja/migration80.incompatible.php

    PHP 7 系までは戻り値の型が指定されていません。 implode($separator, $array) PHP 8 系は戻り値の型が指定されます。 (が、実はそうでもないです。) implode(string $separator, array $array): string
  8. @maikeru (mikumo) implode ラッパー関数 function php74_implode(mixed $separator, mixed $array): string

    { // implode($array, $separator) 対応 if (is_string($array) && is_array($separator)) { return implode($array, $separator); } return implode($separator, $array); }
  9. @maikeru (mikumo) 問題 3 : return する順番 まず正常系をさっさと return させます。

    • implode(string $separator, array $array): string • implode(array $array): string 異常系でエミュレートすべきコードは下げます。 • implode(array $array, string $separator): string • 引数の型が絞られたことによる対応
  10. @maikeru (mikumo) implode ラッパー関数 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 をエミュレートするコードを書く)
  11. @maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string

    $array = null; var_dump( implode($array) ); • PHP 7.4: null が戻ってきた。 • PHP 8.2: エラー
  12. @maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string

    $array = 'example'; var_dump( implode($array) ); • PHP 7.4: null が戻ってきた。 • PHP 8.2: エラー
  13. @maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string

    $separator = null; $array = null; var_dump( implode($separator, $array) ); • PHP 7.4: null が戻ってきた。 • PHP 8.2: エラー
  14. @maikeru (mikumo) PHP 7.4 implode 関数の動作確認 // implode(array $array): string

    $separator = true; $array = [1, 2, 3]; var_dump( implode($separator, $array) ); • PHP 7.4: 123 • PHP 8.2: 123 ($separator は boolean なのにエラーじゃない)
  15. @maikeru (mikumo) implode ラッパー関数 (ここより上が正常系) if ($separator === null &&

    is_array($array)) { return \implode($array); } if (is_array($separator)) { return \implode((string)$array, $separator); }
  16. @maikeru (mikumo) implode ラッパー関数 if ($separator === null && is_array($array))

    { return \implode($array); } if ($array === null) { return null; } return null; }