Posted at

PHP Fatal error: Trait method display has not been applied, because there are collisions with other trait methods on XXXX

More than 5 years have passed since last update.

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

<?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で回避できるらしいが…。