Page 1
Attributeを極める
増補版
Mastering Attributes
pixiv Inc.
USAMI Kenta
2022-03-25
公開日:
by USAMI Kenta@tadsan
にオンラインのZoomウェビナーで開催された『PHPerKaigi 2023』でライトニングトーク(5分)として発表しました。
2022-03-25
お前誰よ
20分ではピクシブ百科事典の事例紹介までたどりつけませんでした(話はするけどあっさりめ)
PHP8.0で変わったこと
すべての機能を使えていますか?
その中でも存在感がありながら「何に使うの」度が高い
毎年なにかと言及されている
アトリビュートってなんだ?
Attribute (属性) - MDN Web Docs 用語集 より
属性名属性値
属性名属性
属性値
要素名(開始)タグ
<a href="?foo">text</a>
<a>要素
今回はHTMLは本題ではないのでここまで
ソースコードにも付加的な情報を付与したい!
付加的な情報…われわれは知っている
Docコメント
/*** @param positive-int $id*/function find(int $id): Book{
人間だけわかれば
ヨシ
人間もわかって
機械可読
実行時に可読で効率高いとうれしい
構文の一部である必要がある
人間だけわかれば
ヨシ
人間もわかって
機械可読
実行時に可読で効率高いとうれしい
構文の一部である必要がある
DocCommentは自由帳
リフレクション
Reflectionという機能を使って読み取れる
ングが実現できる
アトリビュートってなんだ?
Attribute (属性) - MDN Web Docs 用語集 より
https://ja.wikipedia.org/wiki/メタ2022-12-14T19:41:26版より
https://ja.wikipedia.org/wiki/メタ2022-12-14T19:41:26版より
例:写真(画像データ)に対する「撮影場所」や「日時」などの情報
例:楽曲(音声データ)に対する「演奏者」や「ジャンル」などの情報
メタプログラミングプログラムについてのプログラミング
ブラックマジック
メタプロするならコードから情報を読み取れるとうれしい
基本的な定義方法
use Attribute;#[Attribute(Attribute::TARGET_CLASS| Attribute::IS_REPEATABLE)]class MyAttr {
基本的な使いかた
use MyAttr;#[MyAttr('foo', 'bar', 'buz')]class Book{
名前付きの呼び出しも可能
use MyAttr;#[MyAttr(a: 'foo', b: 'bar', c: 'buz')]class Book{
宣伝
これでみなさまはAttributeを定義できるようになりました
Docコメントと何が違うの?
リフレクション
Reflectionという機能を使って読み取れる
ングが実現できる
リフレクション
Reflectionという機能を使って読み取れる
ングが実現できる
何が変わったのか
これでAttributeの機能は全部です!
完全マスター
🎉
機能はめっちゃシンプル
あとはどういう「想い」を載せるか
DI vs Attribute
DB vs Attribute
バリデーション vs Attribute
… プロセスを隔離して実行
PHPUnit 10 vs Attribute
発表を参照のこと
「こっそりやる」vs「堂々とやる」
PHPの後方互換性 vs Attribute
ひっそり佇むAttribute
Attributeを使える
一個の配列にまとめて渡されてしまう
Attributeと同様に個別のパラメータで受け取れるようになる
__construct(array $values) に渡されてしまう
書くと通常のAttributeと同じ仕様で使える
ピクシブ百科事典 vs Attribute
キミだけの最高のユースケースを見付けだせ
