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
780
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
PHPConference関西2024LT資料です
hirobe
February 11, 2024
Tweet
Share
More Decks by hirobe
See All by hirobe
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
1k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
970
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.2k
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.2k
Featured
See All Featured
Designing for humans not robots
tammielis
247
25k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
188
16k
A Modern Web Designer's Workflow
chriscoyier
689
190k
Docker and Python
trallard
35
2.7k
10 Git Anti Patterns You Should be Aware of
lemiorhan
649
58k
Rebuilding a faster, lazier Slack
samanthasiow
74
8.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
323
20k
Building Adaptive Systems
keathley
32
1.9k
Infographics Made Easy
chrislema
238
18k
How STYLIGHT went responsive
nonsquared
92
4.8k
Statistics for Hackers
jakevdp
790
220k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
20
1.8k
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バージョンアップは先送りに……