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
910
改めて学ぶ 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
2k
PHPerライフをChrome拡張開発でちょっと便利に / PR TIMES x DMM.com
meihei3
1
380
ファイルを選択してZIPダウンロードする機能ってどうやって作るの? / phpcondo 2023
meihei3
1
660
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
Delegating the chores of authenticating users to Keycloak
ahus1
0
140
KubeCon + CloudNativeCon Japan 2025 Recap Opening & Choose Your Own Adventureシリーズまとめ
mmmatsuda
0
260
生まれ変わった AWS Security Hub (Preview) を紹介 #reInforce_osaka / reInforce New Security Hub
masahirokawahara
0
440
怖くない!はじめてのClaude Code
shinya337
0
380
Backlog ユーザー棚卸しRTA、多分これが一番早いと思います
__allllllllez__
1
140
AI時代の開発生産性を加速させるアーキテクチャ設計
plaidtech
PRO
3
120
高速なプロダクト開発を実現、創業期から掲げるエンタープライズアーキテクチャ
kawauso
2
8.3k
FOSS4G 2025 KANSAI QGISで点群データをいろいろしてみた
kou_kita
0
390
敢えて生成AIを使わないマネジメント業務
kzkmaeda
2
380
成長し続けるアプリのためのテストと設計の関係、そして意思決定の記録。
sansantech
PRO
0
100
Lambda Web Adapterについて自分なりに理解してみた
smt7174
6
160
Core Audio tapを使ったリアルタイム音声処理のお話
yuta0306
0
180
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
223
9.7k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
How GitHub (no longer) Works
holman
314
140k
Why Our Code Smells
bkeepers
PRO
337
57k
Designing for humans not robots
tammielis
253
25k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.9k
GitHub's CSS Performance
jonrohan
1031
460k
The Invisible Side of Design
smashingmag
301
51k
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 心の一句