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
改めて学ぶ Trait の使い方 / phpcon odawara 2025
Search
meihei
April 12, 2025
Technology
1
900
改めて学ぶ Trait の使い方 / phpcon odawara 2025
改めて学ぶ Trait の使い方
https://fortee.jp/phpconodawara-2025/proposal/4211481b-db98-480d-b2e4-eb317852232d
meihei
April 12, 2025
Tweet
Share
More Decks by meihei
See All by meihei
List とは何か? / PHPerKaigi 2025
meihei3
0
1.1k
WebアプリケーションにおけるPDOの使い方入門 / phpcon odawara 2024
meihei3
3
1.9k
PHPerライフをChrome拡張開発でちょっと便利に / PR TIMES x DMM.com
meihei3
1
380
ファイルを選択してZIPダウンロードする機能ってどうやって作るの? / phpcondo 2023
meihei3
1
650
New Relic CodeStreamを 使って、エラーを 加速的迅速に改修しよう! #NRUG Vol.8
meihei3
0
360
PHP8.2から見る、2つの配列 / PHP Conference Japan 2023
meihei3
0
2.1k
良いコードを書く 〜10年後のPR TIMESを作る〜 / LT会 in #PRTIMES_HACKATHON 2023
meihei3
2
240
月に一度の大規模リファクタリングでレガシーコードと向き合う取り組み / PHP Conference Fukuoka 2023
meihei3
4
1.1k
PHPの配列とデータ構造 / PHPerKaigi 2023
meihei3
3
2k
Other Decks in Technology
See All in Technology
Абьюзим random_bytes(). Фёдор Кулаков, разработчик Lamoda Tech
lamodatech
0
360
Fabric + Databricks 2025.6 の最新情報ピックアップ
ryomaru0825
1
140
Claude Code Actionを使ったコード品質改善の取り組み
potix2
PRO
6
2.4k
SalesforceArchitectGroupOsaka#20_CNX'25_Report
atomica7sei
0
200
Welcome to the LLM Club
koic
0
190
ドメイン特化なCLIPモデルとデータセットの紹介
tattaka
1
180
監視のこれまでとこれから/sakura monitoring seminar 2025
fujiwara3
11
4k
Liquid Glass革新とSwiftUI/UIKit進化
fumiyasac0921
0
240
あなたの声を届けよう! 女性エンジニア登壇の意義とアウトプット実践ガイド #wttjp / Call for Your Voice
kondoyuko
4
480
セキュリティの民主化は何故必要なのか_AWS WAF 運用の 10 の苦悩から学ぶ
yoh
1
190
“社内”だけで完結していた私が、AWS Community Builder になるまで
nagisa53
1
410
エンジニア向け技術スタック情報
kauche
1
280
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
We Have a Design System, Now What?
morganepeng
53
7.7k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
710
Code Review Best Practice
trishagee
68
18k
How GitHub (no longer) Works
holman
314
140k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.8k
Transcript
© 2012-2025 BASE, Inc. 1 #phpcon_odawara #boko 改めて学ぶ Trait の使い方
PHPカンファレンス小田原2025(2025/04/12)
© 2012-2025 BASE, Inc. 2 #phpcon_odawara #boko 自己紹介 meihei |
Yohei Ema BASE株式会社 BASE / Product Dev / Feature Dev 1 X: @app1e_s mixi2: @meihei2 GitHub: @meihei3
キーノートセッション 🍥かま 10:20ー Saki Takamachi 改めて学ぶ Trait の使い方 🍥ぼこ 11:00ー meihei 新しいPHP拡張モジュールインストール方法
「PHP Installer for Extensions (PIE)」 を使ってみよう! 🍥あじ 11:00ー 02 New RelicのAPMを活用した ECサービスにおけるメール遅延解消の舞台裏 🍥かま 15:10ー Futoshi Endo BASEで活躍するメンバーの登壇予定 スポンサーセッション 川口 将貴 🍥かま 11:55ー
None
© 2012-2025 BASE, Inc. 5 #phpcon_odawara #boko • トレイトの使い所を見極められるようにする •
よりトレイトを使いこなすヒントを知る Non goal • 明日からトレイトを使いたい!と思わせる事 このトークのゴール ※ それと、プロポーザルに書いていた「実務のコードで合った良い・悪い使われ方」は時間に収まらなかったので Ask the speaker とかで話しましょう 🙇
© 2012-2025 BASE, Inc. 6 #phpcon_odawara #boko アジェンダ トレイトについて知ろう OSS
ライブラリでの使われ方 トレイトのテストの書き方 1 2 3
© 2012-2025 BASE, Inc. 7 #phpcon_odawara #boko アジェンダ トレイトについて知ろう OSS
ライブラリでの使われ方 トレイトのテストの書き方 1 2 3
© 2012-2025 BASE, Inc. 8 #phpcon_odawara #boko ざっくり説明 • コードを再利用するため仕組み
• クラスに似て、メソッドやプロパティが書ける • 優先順位は現在のクラス → トレイト → 継承元のクラス となる ◦ デフォルト実装を容易する目的で利用される trait Hello { public function sayHello() { echo 'Hello '; } } class HelloWorld { use Hello; public function sayHello() { parent::sayHello(); echo 'World!'; } }
© 2012-2025 BASE, Inc. 9 #phpcon_odawara #boko もっと詳しい話は • PHP
Conference Japan 2022 での sji さんの発表 • トレイト自体の来歴、性質、使いどこ ろについてより詳しく学べます https://www.slideshare.net/slideshow/10-php-trait/253165328
© 2012-2025 BASE, Inc. 10 © 2012-2025 BASE, Inc. 10
” その前に前提として DI(合成)で済むならそっちの ほうがいい [出典] 五十嵐進士 「導入から 10 年、PHP の trait は滅びるべきなのか ーーその適切な使いどころと弱点、将来について」P51 https://www.slideshare.net/slideshow/10-php-trait/253165328
© 2012-2025 BASE, Inc. 11 #phpcon_odawara #boko DI(依存性注入)とトレイト の違いを知り 使い分け方を知る
© 2012-2025 BASE, Inc. 12 #phpcon_odawara #boko 現実からその例を見つける endo(@Fendo181)さんが撮影してくれました
© 2012-2025 BASE, Inc. 13 #phpcon_odawara #boko 現実からその例を見つける • 釣り竿としての契約:仕掛けを少し離れ
たポイントに投げ入れることが出来る • 投げ竿としての契約:糸を伸ばしたり巻 いたりして、より遠くまで仕掛けを投げ 入れることが出来る endo(@Fendo181)さんが撮影してくれました
© 2012-2025 BASE, Inc. 14 #phpcon_odawara #boko 現実からその例を見つける • 釣り竿としての契約:仕掛けを少し離れ
たポイントに投げ入れることが出来る • 投げ竿としての契約:糸を伸ばしたり巻 いたりして、より遠くまで仕掛けを投げ 入れることが出来る
© 2012-2025 BASE, Inc. 15 #phpcon_odawara #boko DI(依存性注入)を見つける
© 2012-2025 BASE, Inc. 16 #phpcon_odawara #boko DI(依存性注入)を見つける
© 2012-2025 BASE, Inc. 17 #phpcon_odawara #boko DI(依存性注入)を見つける • 投げ竿としての契約:糸を伸ばしたり巻
いたりして、より遠くまで仕掛けを投げ 入れることが出来る • リールオブジェクトを合成することで、 この釣り竿は投げ竿オブジェクトとして の振る舞いが出来る • 投げ竿はリールの取り替えが容易
© 2012-2025 BASE, Inc. 18 #phpcon_odawara #boko DI(依存性注入)を見つける • 投げ竿としての契約:糸を伸ばしたり巻
いたりして、より遠くまで仕掛けを投げ 入れることが出来る • リールオブジェクトを合成することで、 この釣り竿は投げ竿オブジェクトとして の振る舞いが出来る • 投げ竿はリールの取り替えが容易
© 2012-2025 BASE, Inc. 19 #phpcon_odawara #boko トレイトを見つける • トレイトは釣り竿オブジェクトを作る
部品の一部(契約はない) • 別のオブジェクトでも共通して使うこと がある • この部品は簡単に取り替えることができ ない(困難)
© 2012-2025 BASE, Inc. 20 #phpcon_odawara #boko トレイトを見つける • トレイトは釣り竿オブジェクトを作る
部品の一部(契約はない) • 別のオブジェクトでも共通して使うこと がある • この部品は簡単に取り替えることができ ない(困難)
© 2012-2025 BASE, Inc. 21 #phpcon_odawara #boko DI とトレイトの違いをまとめると トレイト
• クラスに「便利な振る舞い」を静的に くっつける • 再利用には便利だが、柔軟性に欠け、 依存が見えにくい • テストや差し替えが難しくなる DI(依存性注入) • オブジェクトの振る舞いを外部から与 える • 依存を明示できるため、差し替え・テ ストがしやすい
© 2012-2025 BASE, Inc. 22 #phpcon_odawara #boko • クラスに役割ではなく振る舞いを一時的に貸したいとき ◦
「このオブジェクトが何かを担う」よりも「何かできるようにする」 ◦ Notifiable, EventStorable など • 複数のクラスに横断的に補助的な機能を提供したいとき ◦ ドメインロジックの中心ではない部分の共通化 ◦ DTO の toArray() など • Interfaceのデフォルト実装を提供したいとき ◦ 最も王道のパターン ◦ 「責務はインターフェースに定義」「振る舞いはトレイトで補助」 トレイトの使い所
© 2012-2025 BASE, Inc. 23 © 2012-2025 BASE, Inc. 23
逆にトレイトの使い所以外で トレイトを使うと、悪い方に進む なので、ここぞという時以外は使わない。
© 2012-2025 BASE, Inc. 24 #phpcon_odawara #boko アジェンダ トレイトについて知ろう OSS
ライブラリでの使われ方 トレイトのテストの書き方 1 2 3
© 2012-2025 BASE, Inc. 25 #phpcon_odawara #boko 多分前半の話が長いので記事を紹介 • OSS
ライブラリを調べてまとめた記事 • 時間的にこの発表では喋れない部分を 紹介しています • 実際に我々が書くコードでは3つの使 い方と3つのテストパターンになる https://zenn.dev/meihei/articles/0191f119-65f9-7bb5-ad43-c35d120b8425
© 2012-2025 BASE, Inc. 26 #phpcon_odawara #boko • インターフェースのデフォルト実装 ◦
aws/aws-sdk-php の S3ClientTrait ◦ guzzle/psr7 の MessageTrait • クラスの分割実装 ◦ briannesbitt/Carbon の Comparison や Rounding • 偶然同じ機能を持つクラスの実装の共通化 ◦ laravel/framework の Macroable OSS ライブラリで使われているトレイト
© 2012-2025 BASE, Inc. 27 #phpcon_odawara #boko • クラスに役割ではなく振る舞いを一時的に貸したいとき ◦
偶然同じ機能を持つクラスの実装の共通化 • 複数のクラスに横断的に補助的な機能を提供したいとき ◦ 偶然同じ機能を持つクラスの実装の共通化 • Interfaceのデフォルト実装を提供したいとき ◦ そのままインターフェースのデフォルト実装 トレイトの使い所と使い方
© 2012-2025 BASE, Inc. 28 #phpcon_odawara #boko • クラスに役割ではなく振る舞いを一時的に貸したいとき ◦
偶然同じ機能を持つクラスの実装の共通化 • 複数のクラスに横断的に補助的な機能を提供したいとき ◦ 偶然同じ機能を持つクラスの実装の共通化 • Interfaceのデフォルト実装を提供したいとき ◦ そのままインターフェースのデフォルト実装 トレイトの使い所と使い方 ライブラリの提供 する側でよく見る
© 2012-2025 BASE, Inc. 29 #phpcon_odawara #boko アジェンダ トレイトについて知ろう OSS
ライブラリでの使われ方 トレイトのテストの書き方 1 2 3
© 2012-2025 BASE, Inc. 30 #phpcon_odawara #boko • トレイトを use
したクラスをそのままテストする • テスト専用のクラスを作成してテストする • 無名クラスを作成してテストする トレイトのテストの書き方(オススメ)
© 2012-2025 BASE, Inc. 31 #phpcon_odawara #boko • テストの対象をクラスやインターフェー ス単位で見ている
• テストからはトレイトの存在を知ること はない ◦ 実装の詳細に依存しないテストが書ける • 参考実装 ◦ guzzle/psr7, aws/aws-sdk-php トレイトを use したクラスをそのままテストする
© 2012-2025 BASE, Inc. 32 #phpcon_odawara #boko • テストの対象をトレイト単位で見ている ◦
実装の詳細にも関心がある • 定義したテスト専用クラスに名前をつけ たい場合に有効 • 参考実装 ◦ laravel/framework テスト専用のクラスを作成してテストする
© 2012-2025 BASE, Inc. 33 #phpcon_odawara #boko • テストの対象をトレイト単位で見ている ◦
テスト専用のクラスを作成してテストする 場合と同じ • 定義したテスト専用クラスに名前をつけ たく無い場合に有効 • 参考実装 ◦ symfony/symfony, googleapis/google-auth-library-php 無名クラスを作成してテストする
© 2012-2025 BASE, Inc. 34 #phpcon_odawara #boko • テストコードからトレイトを use
する ◦ トレイトの振る舞いをテストコードが持つことになり、テストクラスの責任が不明確になる • TestCase::getMockForTrait, TestCase::getObjectForTrait を使う ◦ PHPUnit12で削除された • トレイトの private / protected メソッドをテストする ◦ トレイトをクラスの実装の一部と見ると、クラスの private / protected メソッドを テストすることがおかしいとわかる NGなトレイトのテストの書き方
© 2012-2025 BASE, Inc. 35 #phpcon_odawara #boko • トレイトは「便利な振る舞い」を再利用するために使う ◦
が、ほとんどの場合は DI (依存性注入)がいい • トレイトの使い所としては3つ ◦ クラスに役割ではなく振る舞いを一時的に貸したいとき ◦ 複数のクラスに横断的に補助的な機能を提供したいとき ◦ Interfaceのデフォルト実装を提供したいとき • トレイトのテスト(オススメ)は3つ ◦ トレイトを use したクラスをそのままテストする ◦ テスト専用のクラスを作成してテストする ◦ 無名クラスを作成してテストする まとめ
© 2012-2025 BASE, Inc. 36 © 2012-2025 BASE, Inc. 36
トレイトか 用法守れば まあ便利 —— meihei 心の一句