PHP:使用同名方法处理特征

问题描述 投票:0回答:2

我在这个网站和谷歌上进行了搜索,最终创建了这个帐户......
我需要一些有关 php、特征和类的帮助。我有这两个不同的特征,它们有一些同名的方法。

问题在于我需要它们!我不能用代替...

这是一个示例代码: 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();

所以,这个例子的结尾很明显

致命错误:特征方法 myfunc 尚未应用,因为与 myclass 上的其他特征方法发生冲突

如何在不更改这些方法名称的情况下解决这个问题?可以吗?

顺便说一句,这是我一生中见过的最糟糕的编辑器!

php class inheritance scope traits
2个回答
12
投票

你仍然需要解决冲突以支持一种特质。这里你只需要别名即可。这不是重命名,而是别名。

添加到

use
块:

traitA::myfunc insteadof traitB;

(或

traitB::myfunc insteadof traitA;

它应该可以工作。

您现在有两个所需的别名,冲突也已解决。


0
投票

你可以这样做:

use traitA, traitB {
    traitA::myFunc insteadof traitB; //uses traitA myFunc() method
    traitB::myFunc as myFuncB;       //alias traitB's myFunc method
}

通过这种方式,您可以使用这两个特征中的函数。

© www.soinside.com 2019 - 2024. All rights reserved.