Question

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!

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top