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.2k
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
PHPConference関西2024LT資料です
hirobe
February 11, 2024
Tweet
Share
More Decks by hirobe
See All by hirobe
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
820
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
1.8k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.3k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.6k
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.4k
Featured
See All Featured
Embracing the Ebb and Flow
colly
84
4.5k
Practical Orchestrator
shlominoach
186
10k
The World Runs on Bad Software
bkeepers
PRO
66
11k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7k
Code Review Best Practice
trishagee
65
17k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
170
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
530
GitHub's CSS Performance
jonrohan
1031
460k
Docker and Python
trallard
42
3.1k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.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バージョンアップは先送りに……