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.3k
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
PHPConference関西2024LT資料です
hirobe
February 11, 2024
Tweet
Share
More Decks by hirobe
See All by hirobe
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
1.2k
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
2k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.4k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.7k
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.4k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
What's in a price? How to price your products and services
michaelherold
244
12k
Speed Design
sergeychernyshev
28
820
KATA
mclloyd
29
14k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Facilitating Awesome Meetings
lara
53
6.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
11
560
Git: the NoSQL Database
bkeepers
PRO
429
65k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
The Cult of Friendly URLs
andyhume
78
6.2k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.6k
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バージョンアップは先送りに……