💡
useしているTraitの一部のメソッドをオーバーライドするけど、元のメソッドを呼び出したい場合の対応方法
PHPでしばしば使われるTrait。
しかし、メソッドをそのまま書き換えるのではなく、元のメソッドを拡張したいことも多いのではないでしょうか。
parentで呼び出せばいいのでは?
<?php
class Kernel extends BaseKernel
{
use MicroKernelTrait;
private function configureContainer(ContainerConfigurator $container, LoaderInterface $loader, ContainerBuilder $builder): void
{
parent::configureContainer($container, $loader, $builder);
}
}
これはSymfonyのKernelのコードですが、configureContainerメソッドはMicroKernelTraitで実装されています。
この場合、parentを使って元々定義されているメソッドを呼び出そうとすると、そのメソッドが存在しないため、エラーが発生します。
as 演算子を使ってもともと定義されいてるメソッドも呼び出せる
Traitでメソッド名が重複してしまう場合(衝突)、as演算子を使ってエイリアスを設定することで回避できます。
詳しくはPHPマニュアルのtraitの衝突の解決ををご覧ください。
このエイリアスを利用することで、元のメソッドを呼び出すことが可能になります。
class Kernel extends BaseKernel
{
use MicroKernelTrait {
MicroKernelTrait::configureContainer as configureContainerTrait;
}
private function configureContainer(ContainerConfigurator $container, LoaderInterface $loader, ContainerBuilder $builder): void
{
$this->configureContainerTrait($container, $loader, $builder);
$configDir = $this->getConfigDir();
$container->import($configDir.'/app.yaml');
}
}
上記のコードでは、MicroKernelTraitで定義されているconfigureContainerメソッドにconfigureContainerTraitというエイリアスを設定しています。
そして、Kernelクラスで新たにconfigureContainerメソッドを定義し、その中でエイリアスを利用して元のconfigureContainerを呼び出しています。
これにより、MicroKernelTraitのconfigureContainerメソッドを活用しつつ、追加の処理を行うことができます。
Discussion