Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与...
Search
hirobe
February 11, 2024
0
1.1k
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
PHPConference関西2024LT資料です
hirobe
February 11, 2024
Tweet
Share
More Decks by hirobe
See All by hirobe
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
1.7k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.3k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.5k
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.4k
Featured
See All Featured
Side Projects
sachag
452
42k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Building Adaptive Systems
keathley
38
2.3k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
How to Ace a Technical Interview
jacobian
276
23k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Become a Pro
speakerdeck
PRO
25
5k
Producing Creativity
orderedlist
PRO
341
39k
Transcript
© RAKUS Co., Ltd. 1 PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響 #phpkansai 2024/02/11
廣部知⽣
2 ⾃⼰紹介 21卒で株式会社ラクスに⼊社 PHPでMail Dealerの開発を⾏っている 『良いコード悪いコードで学ぶ設計⼊⾨』や 『ちょうぜつソフトウェア設計⼊⾨』で 設計を学ぶ⽇々…… 未だにスト6で戦いの螺旋を登り続けています (Act2はMR1700でフィニッシュ)
3 について メール共有管理システム 14年連続シェアNo.1(2009〜2022)※ 歴史は更に⻑く、2001年4⽉に販売開始 Laravelは2011年リリースなので、10歳年上 ※出典:ITR「ITR Market View:メール∕Webマーケティング市場2023」
メール処理市場:ベンダー別売上⾦額推移およびシェア2009-2022年度(予測値)
© RAKUS Co., Ltd. 4 PHPのアップデート、してますか?
5 Mail DealerのPHPアップデート戦略 • 使⽤中のバージョンがEOLを迎えるときに 最新のバージョンへアップデートする戦略 • 使⽤中のPHP8.0が 2023/11/26 にサポート終了予定
だったので当時最新だった PHP8.2 へ • PHP8.1と、8.2の変更点を調べる
© RAKUS Co., Ltd. 6 PHP8.1
7 PHP8.1 の新機能! • ENUM型! • 読み取り専⽤プロパティ! • 引数デフォルト値にNew! •
Finalクラス定数! などなど ※参考:https://www.php.net/releases/8.1/ja.php
8 PHP8.0 → PHP8.1への移⾏ 下位互換性のない変更 • $GLOBALS へのアクセス制限 • 継承したメソッド内で
static 変数を使う • 必須の引数の前に、デフォルト値を持つ引数を指定した場合 • 内部クラスと戻り値の型の互換性 • 新しいキーワード • リソースからオブジェクトへの移⾏ ※参考:https://www.php.net/manual/ja/migration81.php
© RAKUS Co., Ltd. 9 リソースからオブジェクトへの移⾏? 🤔
10 リソースからオブジェクトへの移⾏ いくつかの リソース が、object に移⾏しました。 (´_ゝ`)フーン まあ⼤したことないだろ
11 リソースからオブジェクトへの移⾏ いくつかの リソース が、object に移⾏しました。 is_resource() 関数を使って戻り値をチェックしている コードは、false を返すことをチェックするコードに
置き換えるべきです。 ※参考:https://www.php.net/manual/ja/migration81.php
12 object移⾏によって⾏ったこと 今まで(PHP 8.0以前) $resource = pg_connect($connect_info) //接続成功時にresourceを返す is_resource($resource) //true
これから(PHP8.1以降) $object = pg_connect($connect_info) //接続成功時にobjectを返す is_resource($object) //false
© RAKUS Co., Ltd. 13
14 PgSQL関数の変更による被害が甚⼤ DBへの接続判定や、SQLの実⾏結果の有無の判定に リソース変更が直撃
15 崩壊その1 DBへの接続処理判定に失敗し、SQLが実⾏されなくなる $connection = pg_connect($connect_info); // 接続成功時にobjectを返す if (is_resource($connection)){
// false判定されるように! $result = pg_query_params($connection, $query, $params) } else { throw new DbConnectException(); // 必ず接続エラーに }
16 崩壊その2 SQLの実⾏結果判定に失敗し、結果があるのに結果なしと判定 $result = pg_query_params($connection, $query, $params); if (is_resource($result)){
// false判定される! return pg_fetch_object($result) } else { return false; // 必ず結果なしになってしまう }
© RAKUS Co., Ltd. 17 どうして マイナーアップデートで こんな破壊的変更を 加えたんですか……?
18 とはいえ、修正はそんなに難しくない is_resource()の判定を、falseかどうかの判定に変えればOK $result = pg_query_params($connection, $query, $params); if ($result
!== false){ return pg_fetch_object($result) } else { return false; } まあそのis_resource()の使⽤箇所を調べるのが ⼤変だったりはしたのですが……
© RAKUS Co., Ltd. 19 簡単に直っても マイナーアップデートで 破壊的変更を加えるのは やめてほしいです……
© RAKUS Co., Ltd. 20 時間があまるはず……
© RAKUS Co., Ltd. 21 PHP8.0→8.2で困ったことあげてきます
22 mb_detect_encodingの検出順位変更 タイトル通り 8.0と8.1で検出順位が変わる →今まで正常に受信できていたメール本⽂が ⽂字化けして受信されるように 詳しくは「PHP8.2にバージョンアップしたら⽂字化けが発⽣して 道頓堀に⾶び込みたくなった話」にてやってました(過去形)
23 htmlspecialcharsのデフォルト値変更 以下の関数のデフォルト値が ENT_COMPAT → ENT_QUOTES | ENT_SUBSTITUTE に •
htmlspecialchars() • htmlentities() • htmlspecialchars_decode() • html_entity_decode() • get_html_translation_table()
24 htmlspecialcharsのデフォルト値変更 互換性維持のため、関数使⽤箇所を洗い出して ENT_COMPAT を明⽰的に指定していく……
25 PHPUnitのバージョンアップ(したかった……) バージョンアップに伴い、PHPUnit 10を利⽤できるように 現在使ってるPHPUnit 9も、いずれはサポート終了するので この機会に上げたい! →DBUnitがPHP10から⾮対応に Maildealerはレガシーなテストも多く、 DBと密結合したテストもざらにある
→PHPUnitバージョンアップは先送りに……