Reputation: 133
I've search all over this site and google and I ended up creating this account...
I need some help with php, traits and classes. I have this 2 different traits, that have some methods with the same name.
The problem relies on that I need both of them! I can't use insteadof...
Here goes an example code: http://sandbox.onlinephpfunctions.com/code/b69f8e73cccd2dfd16f9d24c5d8502b21083c1a3
trait traitA {
protected $myvar;
public function myfunc($a) { $this->myvar = $a; }
}
trait traitB
{
public function myfunc($a) { $this->myvar = $a * $a; }
}
class myclass
{
protected $othervar;
use traitA, traitB {
traitA::myfunc as protected t1_myfunc;
traitB::myfunc as protected t2_myfunc;
}
public function func($a) {
$this->myvar = $a * 10;
$this->othervar = t2_myfunc($a);
}
public function get() {
echo "myvar: " . $this->myvar . " - othervar: " . $this->othervar;
}
}
$o = new myclass;
$o->func(2);
$o->get();
So, this example ends in an obvious
Fatal error: Trait method myfunc has not been applied, because there are collisions with other trait methods on myclass
How can I solve this without changing those method's name? Is it possible?
On a side note, this is the worst editor I've ever seen in my life!
Upvotes: 13
Views: 10241
Reputation: 81
You can do like this :
use traitA, traitB {
traitA::myFunc insteadof traitB; //uses traitA myFunc() method
traitB::myFunc as myFuncB; //alias traitB's myFunc method
}
In this way you can use functions from both trait.
Upvotes: 1
Reputation: 23777
You still need to resolve the conflict in favour of one trait. Here you only aliased the name. It's not a renaming, but an alias.
Add to the use
block:
traitA::myfunc insteadof traitB;
(or traitB::myfunc insteadof traitA;
)
and it should work.
You now have two aliases as wanted and the conflict is resolved too.
Upvotes: 12