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

レガシーシステムにおけるPHP8バージョンアップのアプリ対応記録

don
October 02, 2021

 レガシーシステムにおけるPHP8バージョンアップのアプリ対応記録

don

October 02, 2021
Tweet

More Decks by don

Other Decks in Programming

Transcript

  1. #phpconf 自己紹介 • 頓花 貴俊 (どんが たかとし) • 所属 ◦

    株式会社 ラクス ◦ 販売管理システム【楽楽販売】 • 技術 ◦ メイン:PHP、Javascript、PostgreSQL ◦ 経験 :Java、C言語、Fortran
  2. #phpconf イントロダクション 今年EOLを迎える PHP7.3 → PHP8.0 の バージョンアップを実施 PHP バージョン

    初回リリース日 アクティブサポート セキュリティサポート 8.0 2020/11/26 2022/11/26 2023/11/26 7.4 2019/11/28 2021/11/28 2022/11/28 7.3 2018/12/06 2020/12/06 2021/12/06 一つ飛ばし
  3. #phpconf 緩やかな比較演算子の挙動変更 挙動が変わる対象  文字列 と 数値 の 比較 ($int ⇔

    $string, $float ⇔ $string) $string : 整数形式 $int ⇔ (int) $string $string : 浮動小数形式 $int ⇔ (float) $string 上記以外 $int ⇔ (int) $string $string : 整数形式 $float ⇔ (float) $string $string : 浮動小数形式 $float ⇔ (float) $string 上記以外 $float ⇔ (float) $string PHP 7.x ※ 左右関係なし
  4. #phpconf 緩やかな比較演算子の挙動変更 挙動が変わる対象  文字列 と 数値 の 比較 ($int ⇔

    $string, $float ⇔ $string) $string : 整数形式 $int ⇔ (int) $string $string : 浮動小数形式 $int ⇔ (float) $string 上記以外 (string) $int ⇔ $string $string : 整数形式 $float ⇔ (float) $string $string : 浮動小数形式 $float ⇔ (float) $string 上記以外 (string) $float ⇔ $string PHP 8.x ※ 左右関係なし
  5. #phpconf 緩やかな比較演算子の挙動変更 まとめると、 対象  文字列 と 数値 の 比較 ($int

    ⇔ $string, $float ⇔ $string) 事象 文字列側 が 数値形式でない 場合 数値側 が文字列 に変換され、比較結果が 反転 する 条件式 7.x 8.x 0 == "0" TRUE TRUE 0 == "0.0" TRUE TRUE 0 == "foo" TRUE FALSE 0 == "" TRUE FALSE 42 == " 42" TRUE TRUE 42 == "42foo" TRUE FALSE 要注意
  6. #phpconf 緩やかな比較演算子の挙動変更 - 関数・式 - • 演算子 == , !=

    , > , >= , < , <= • 配列関数 in_array()、array_search()、array_keys() • ソート関数 sort()、rsort()、asort()、arsort()、array_multisort() • switch文
  7. #phpconf 緩やかな比較演算子の挙動変更 - 具体例 - フォーム から パラメータ が 「””」(空文字)

    と 数値 で 比較している場合 PHP 7.x (int)“” == 0 ⇒ true PHP 8.x “” == (string) 0 ⇒ false PHP 7.x (int)“” < 1000 ⇒ false PHP 8.x “” < (string) 1000 ⇒ true
  8. #phpconf 警告レベルの変更 • ERROR に 変更されたエラー ◦ 配列関数の引数に配列以外の型を指定 ◦ BCMath関数の引数に数値形式以外を指定

    ◦ implode()の歴史的な問題の削除 • WARNING に 変更されたエラー ◦ 未定義の変数の読み取り ◦ 未定義の配列のキーを読み取り ◦ 配列でない値のインデックスにアクセス
  9. #phpconf 警告レベルの変更 - 具体例 - • ERROR に 変更されたエラー ◦

    配列関数の引数に配列以外の型を指定 ◦ BCMath関数の引数に数値形式以外を指定 ◦ implode()の歴史的な問題の削除 PHP 7.x ⇒ 出力:10.1 (string) PHP 8.x ⇒ Fatal error PHP 7.x ⇒ 出力:1 (int) PHP 8.x ⇒ Fatal error
  10. #phpconf 警告レベルの変更 - 具体例 - • WARNING に 変更されたエラー ◦

    未定義の変数の読み取り ◦ 未定義の配列のキーを読み取り ◦ 配列でない値のインデックスにアクセス PHP 7.x ⇒ 出力:null PHP 8.x ⇒ 出力:null | Warning
  11. #phpconf 緩やかな比較演算子の挙動変更 - 課題 - 演算子や標準関数を含め 影響箇所 は 約2.7万 →

    本来、すべて動作が変わるか確認が必要 (※ アプリ全体のphpコード は 約47万行) ⇒ すべてを 前後関係含めて、チェックは不可能
  12. #phpconf 今回どのように対応したのか - 実例 - ➢ 修正対象を絞る ◦ 比較演算子の結果が変わるパターンから 影響箇所を絞り込み、修正を実施(ラップ関数に変換など)

    例) 発見不具合:「””==0」の Boolean値が変わる 0 (定数化含み)と比較しているものリストアップし、 比較側をキャストするように修正 比較1 等号 比較2 v7.3 v8.0 check 0 == 0 => true true 〇 0 == 'abc' => true false × 0 == '' => true false × 0 == true => false false 〇
  13. #phpconf ➢ チェック関数で調査 ◦ 通過しても動作が変わるか確認できない ▪ 引数が正常かチェックする関数を作成 今回どのように対応したのか - 実例

    - 例) 発見不具合:「array_key_exist()」第一引数「””」第二引数「0,1,2」の挙動変更 ・第二引数 の 配列内 で 型 が違うもの ・第一引数 の 型 と 第二引数 の 配列の値 の型が違うもの 上記 をチェックし、ログとして出力
  14. #phpconf 品質の担保 • 自動テスト ◦ E2E テスト・ユニットテストで重要機能をテスト → データパターンが用意されている •

    手動テスト ◦ データバリエーションが必要ない箇所のテスト → テストパターンを、「0件, 1件, 複数件」と データが存在しないとき ⇒ 自動テストと手動テストで確認
  15. #phpconf 見つかった不具合 • 動作テストで発見された不具合 10件程度 • リリース半年内で発見された不具合 2件 (※ 軽微なもの)

    → 調査 ・不具合発見時の再調査 ⇒ 全量把握・それに対する検討 により 品質を担保 → チーム内 で 修正方針の検討 なぜ、不具合が少なかったのか?
  16. #phpconf これからのバージョンアップに向けて テストが必要な対象画面の自動テストの作成には 手動テスト 実施工数 の 約 5 倍 かかる想定

    デメリット → どのテストケースを自動化するのか ⇒ 見極めが必要 ➢ 自動テストを追加する • コストが高い ⇒ 今回は作成コストには合わない、手動テスト実施