🤖

Trait method display has not been applied

2021/12/29に公開

PHP Fatal error: Trait method display has not been applied, because there are collisions with other trait methods on XXXX というエラーが出た。

こんな感じのコードで怒られた。

<?php
trait BaseModule
{
    function display()
    {
        echo "BaseModule::display\n";
    }
}

trait ModuleA
{
    use BaseModule;
}

trait ModuleB
{
    use BaseModule;
}

class Test
{
    use ModuleA;
    use ModuleB;
}

(new BaseModule)->display();

Rubyとかだとどうなってるんだろうと思って試してみた。

module BaseModule
  def dispay
    puts "BaseModule::display"
  end
end

module ModuleA
  include BaseModule
end

module ModuleB
  include BaseModule
end

class Test
  include ModuleA
  include ModuleB
end

Test.new.display

Rubyは期待通りに

BaseModule::display

って表示される。

うーん。insteadofで回避できるらしいが…。

Discussion