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
790
改めて学ぶ 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
990
WebアプリケーションにおけるPDOの使い方入門 / phpcon odawara 2024
meihei3
3
1.8k
PHPerライフをChrome拡張開発でちょっと便利に / PR TIMES x DMM.com
meihei3
1
370
ファイルを選択してZIPダウンロードする機能ってどうやって作るの? / phpcondo 2023
meihei3
1
630
New Relic CodeStreamを 使って、エラーを 加速的迅速に改修しよう! #NRUG Vol.8
meihei3
0
330
PHP8.2から見る、2つの配列 / PHP Conference Japan 2023
meihei3
0
2.1k
良いコードを書く 〜10年後のPR TIMESを作る〜 / LT会 in #PRTIMES_HACKATHON 2023
meihei3
2
230
月に一度の大規模リファクタリングでレガシーコードと向き合う取り組み / PHP Conference Fukuoka 2023
meihei3
4
1.1k
PHPの配列とデータ構造 / PHPerKaigi 2023
meihei3
3
2k
Other Decks in Technology
See All in Technology
Tailwind CSS の小話「コンテナークエリーって便利」
yamaday
0
120
名単体テスト 禁断の傀儡(モック)
iwamot
PRO
1
270
newmo の創業を支える Software Architecture と Platform Engineering
110y
5
530
事業と組織から目を逸らずに技術でリードする
ogugu9
8
1.4k
Datadog のトライアルを成功に導く技術 / Techniques for a successful Datadog trial
nulabinc
PRO
0
160
MCP でモノが動くとおもしろい/It is interesting when things move with MCP
bitkey
2
530
[新卒向け研修資料] テスト文字列に「うんこ」と入れるな(2025年版)
infiniteloop_inc
13
40k
本当に必要なのは「QAという技術」だった!試行錯誤から生まれた、品質とデリバリーの両取りアプローチ / Turns Out, "QA as a Discipline" Was the Key!
ar_tama
9
4.7k
DynamoDB のデータを QuickSight で可視化する際につまづいたこと/stumbling-blocks-when-visualising-dynamodb-with-quicksight
emiki
0
160
Part1 GitHubってなんだろう?その2
tomokusaba
2
760
AI-in-the-Enterprise|OpenAIが公開した「AI導入7つの教訓」——ChatGPTで変わる企業の未来とは?
customercloud
PRO
0
170
MagicPod MCPサーバー開発の裏側とAIエージェント活用の展望
magicpod
0
230
Featured
See All Featured
A Tale of Four Properties
chriscoyier
159
23k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Building an army of robots
kneath
305
45k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
700
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
How STYLIGHT went responsive
nonsquared
100
5.5k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
Optimising Largest Contentful Paint
csswizardry
37
3.2k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
32
5.6k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
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 心の一句