アトリビュート
BEAR.SundayはBEAR.Package ^1.10.3
から従来のアノテーションに加えて、PHP8のアトリビュートをサポートします。
アノテーション
/**
* @Inject
* @Named('admin')
*/
public function setLogger(LoggerInterface $logger)
アトリビュート
#[Inject, Named('admin')]
public function setLogger(LoggerInterface $logger)
#[Embed(rel: 'weather', src: 'app://self/weather{?date}')]
#[Link(rel: 'event', href: 'app://self/event{?news_date}')]
public function onGet(string $date): self
引数に適用
アノテーションはメソッドにしか適用できず引数名を名前で指定する必要があるものがありましたが、PHP8では直接、引数のアトリビュートで指定することができます。
public __construct(
#[Named('payment')] LoggerInterface $paymentLogger,
#[Named('debug')] LoggerInterface $debugLogger
)
public function onGet($id, #[Assisted] DbInterface $db = null)
public function onGet(#[CookieParam('id')] string $tokenId): void
public function onGet(#[ResourceParam(uri: 'app://self/login#nickname')] string $nickname = null): static
互換性
アトリビュートとアノテーションは1つのプロジェクトに混在することもできます。1 このマニュアルに表記されている全てのアノテーションはアトリビュートに変更しても動作します。
パフォーマンス
最適化されるため、プロダクション用にアノテーション/アトリビュート読み込みコストがかかることはほとんどありませんが、 以下のようにアトリビュートリーダーしか使用しないと宣言すると開発時の速度が向上します。
// tests/bootstap.php
use Ray\ServiceLocator\ServiceLocator;
ServiceLocator::setReader(new AttributeReader());
// DevModule
$this->install(new AttributeModule());
-
1つのメソッドで混在するときはアトリビュートが優先されます。 ↩