php - 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();
解决方案
您需要添加要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();
推荐阅读
- javascript - how to parse an array string into array
- django - 单个查询集中不同对象的不同序列化程序
- google-sheets - 如何反转 Google 表格上的表单提交顺序
- javascript - React-Bootstrap Modal 仅在纯 HTML 中设置样式
- html - 在 HTML/CSS 中布局标签栏:在较小的元素之前收缩较大的元素
- arrays - 使用 forEach 而不是 map ,尝试访问 Array 中的对象
- python - try: 未拦截的异常:
- qt-creator - QT Creator 有拆分文件视图吗?
- azure - SignalR(无服务器).NET 控制台客户端未收到消息
- python - 有时间限制的静音命令