💡

useしているTraitの一部のメソッドをオーバーライドするけど、元のメソッドを呼び出したい場合の対応方法

2024/08/23に公開

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