首页 > 解决方案 > PHP:如何使用超过 3 个具有相同函数名称的特征?我想使用所有相同名称的函数

问题描述

如果我有两个特征并且两个特征都使用相同的函数名称

trait mytrait1{
  public function triatfunction(){
    echo 'trait function1';
  }
}
trait mytrait2{
  public function triatfunction(){
    echo 'trait function2';
  }
}

class ParentClass{
    public function parentfunction(){
        echo 'parent function';
    }
}

class ChildClass extends ParentClass{
    use mytrait1,mytrait2{
        mytrait1::triatfunction as  triatfunction1; 
        mytrait2::triatfunction as  triatfunction2;     
    }
    public function childfunction(){
        echo 'child function';
    }
}


$obj = new ChildClass();

$obj->parentfunction();
echo '<br>';
$obj->childfunction();
echo '<br>';
$obj->triatfunction1();
echo '<br>';
$obj->triatfunction2();

致命错误:Trait 方法 triatfunction 未应用,因为在 ChildClass 上与其他 trait 方法有冲突

我无法在上面的代码中使用 as 关键字。


但如果改变

    use mytrait1,mytrait2{
        mytrait1::triatfunction as  triatfunction1; 
        mytrait2::triatfunction as  triatfunction2;     
    }

    use mytrait1,mytrait2{
        mytrait1::triatfunction insteadof mytrait2; 
        mytrait2::triatfunction as  triatfunction2;     
    }

并使用

$obj->triatfunction();
echo '<br>';
$obj->triatfunction2();

有用。


现在我有三个具有相同名称的功能的特征。

如何在我的函数的所有不同特征中使用所有三个函数

trait mytrait1{
  public function triatfunction(){
    echo 'trait function1';
  }
}
trait mytrait2{
  public function triatfunction(){
    echo 'trait function2';
  }
}
trait mytrait3{
  public function triatfunction(){
    echo 'trait function3';
  }
}

class ParentClass{
    public function parentfunction(){
        echo 'parent function';
    }
}

class ChildClass extends ParentClass{
    use mytrait1,mytrait2,mytrait3{
        mytrait1::triatfunction insteadof mytrait2; 
        mytrait2::triatfunction as traitfunction1;  
        mytrait3::triatfunction as  triatfunction2;     
    }
    public function childfunction(){
        echo 'child function';
    }
}


$obj = new ChildClass();

$obj->parentfunction();
echo '<br>';
$obj->childfunction();
echo '<br>';
$obj->triatfunction();
echo '<br>';
$obj->triatfunction1(); 
echo '<br>';
$obj->triatfunction2(); 

标签: php

解决方案


您需要添加要insteadof替换的所有特征,而不仅仅是其中的一部分。

在您的情况下,您只是更换mytrait2,但mytrait3仍然具有相同的功能并且冲突没有解决。关键字as正在创建别名,但不能解决冲突。

例如,如果特征 A、B、C、D 都具有相同的方法someMethod,则需要指出 A 替换它们,如下所示: A::someMethod insteadof B, C, D;

trait mytrait1{
  public function triatfunction(){
    echo 'trait function1';
  }
}
trait mytrait2{
  public function triatfunction(){
    echo 'trait function2';
  }
}
trait mytrait3{
  public function triatfunction(){
    echo 'trait function3';
  }
}

class ParentClass{
    public function parentfunction(){
        echo 'parent function';
    }
}

class ChildClass extends ParentClass{
    use mytrait1,mytrait2,mytrait3{
        mytrait1::triatfunction insteadof mytrait2, mytrait3; 
        mytrait2::triatfunction as triatfunction1;  
        mytrait3::triatfunction as triatfunction2;     
    }
    public function childfunction(){
        echo 'child function';
    }
}


$obj = new ChildClass();

$obj->parentfunction();
echo '<br>';
$obj->childfunction();
echo '<br>';
$obj->triatfunction();
echo '<br>';
$obj->triatfunction1(); 
echo '<br>';
$obj->triatfunction2(); 

推荐阅读