Jus*_*igh 24 php class multiple-inheritance traits
更新:在我对这个问题的思考中并不孤单,这似乎确实是一个错误.看到这里.它修复的那一天将是一个美好的一天!:)
这开始了I love PHP traits! I'm going to use them everywhere! ^_^,现在它变成了一个Thought Exercise / Learning Experience >_<.
请考虑以下示例:
trait TheErrorOfYourWays{
public function booboo(){
echo 'You had a booboo :(';
}
}
trait SpectacularStuff1 {
use TheErrorOfYourWays;
}
trait SpectacularStuff2 {
use TheErrorOfYourWays;
}
class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2;
}
Run Code Online (Sandbox Code Playgroud)
这导致(显然不那么明显):
致命错误:Trait方法booboo尚未应用,因为在DoSomethingSpectacular上存在与其他特征方法的碰撞.
所以我的问题是:如何解决特征中的方法冲突?是否有可能实现重叠特质"继承"?如果是这样,那么"正确"的方法是什么?
为什么我要这样做:
我尝试过的:
一系列奇妙的"as",别名,甚至是不同的地方,时代,宇宙等.包括但不限于:
trait SpectacularStuff1 {
use TheErrorOfYourWays{
TheErrorOfYourWays::booboo as booboo1;
}
}
trait SpectacularStuff2 {
use TheErrorOfYourWays{
TheErrorOfYourWays::booboo as booboo2;
}
}
class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2 {
/* Tried separately, but included here for brevity's sake */
SpectacularStuff1::booboo as booboo3;
SpectacularStuff2::booboo as booboo4;
}
}
Run Code Online (Sandbox Code Playgroud)
和
use TheErrorOfYourWays as Erroneous1;
trait SpectacularStuff1 {
use Erroneous1{
Erroneous1::booboo as booboo1;
}
}
use TheErrorOfYourWays as Erroneous2;
trait SpectacularStuff2 {
use Erroneous2{
Erroneous2::booboo as booboo2;
}
}
Run Code Online (Sandbox Code Playgroud)我明白那个:
谢谢!
Sha*_*ran 20
您需要使用关键字 insteadof来解决Traits中的冲突.
重写你的
class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2 {
/* Tried separately, but included here for brevity's sake */
SpectacularStuff1::booboo as booboo3;
SpectacularStuff2::booboo as booboo4;
}
}
Run Code Online (Sandbox Code Playgroud)
至
class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2
{
SpectacularStuff1::booboo insteadof SpectacularStuff2;
SpectacularStuff2::booboo insteadof SpectacularStuff1;
}
}
Run Code Online (Sandbox Code Playgroud)
将解决冲突.
所以非官方的“官方”答案是:
你可以在没有别名的情况下做到这一点,而不是或任何东西!但尚未...
我从 5.5.1 升级到 5.5.6 但都是徒劳的。当修复可用时,我将更新此答案。有趣的是,您可以直接调用 trait 静态函数。以下示例有效:
trait TheErrorOfYourWays{
public static function booboo($thisTrait){
echo 'You had a booboo :( in '.$thisTrait.'<br>';
}
}
trait SpectacularStuff1 {
public function boobooTest1(){
TheErrorOfYourWays::booboo(__TRAIT__);
}
}
trait SpectacularStuff2 {
public function boobooTest2(){
TheErrorOfYourWays::booboo(__TRAIT__);
}
}
class DoSomethingSpectacular {
use SpectacularStuff1, SpectacularStuff2;
}
$boobooAChoo = new DoSomethingSpectacular();
$boobooAChoo->boobooTest1(); // You had a booboo :( in SpectacularStuff1
$boobooAChoo->boobooTest2(); // You had a booboo :( in SpectacularStuff2
Run Code Online (Sandbox Code Playgroud)
是的,是的,你也可以通过课程来做到这一点,但上个赛季的课程太棒了。