与其他特征方法的碰撞

2021/01/14 11:41 · php ·  · 0评论

如何使用同名方法处理特征?

trait FooTrait {
  public function fooMethod() {
        return 'foo method';
  }

  public function getRow() {
        return 'foo row';
  }
}

trait TooTrait {
    public function tooMethod() {
        return 'too method';
    }

    public function getRow() {
        return 'too row';
    }
}

class Boo
{
    use FooTrait;
    use TooTrait;

    public function booMethod() {
        return $this->fooMethod();
    }
}

错误,

致命错误:尚未应用特质方法getRow,因为Boo中与其他特征方法存在冲突。

我该怎么办?

而且,使用两个相同的方法名称,如何从中获取方法trait FooTrait

$a = new Boo;
var_dump($a->getRow()); // Fatal error: Call to undefined method Boo::getRow() in... 

编辑:

class Boo
{
    use FooTrait, TooTrait {
        FooTrait::getRow insteadof TooTrait;
    }

    public function booMethod() {
        return $this->fooMethod();
    }
}

如果我也想getRowTooTraitvia获取方法Boo怎么办?可能吗?

有关冲突的PHP文档:

如果两个特性插入一个具有相同名称的方法,并且如果冲突没有得到明确解决,则会产生致命错误。

要解决同一类中使用的特性之间的命名冲突,需要使用代替运算符来选择恰好是其中一种冲突方法。

由于这仅允许一个方法排除,因此可以使用as运算符以另一个名称包含冲突的方法之一。

Example#5冲突解决

在此示例中,Talker使用特征A和B。由于A和B具有冲突的方法,因此它定义使用特征B的smallTalk变体和特征A的bigTalk变体。

Aliased_Talker利用as运算符可以在另一个别名对话下使用B的bigTalk实现。

<?php
trait A {
    public function smallTalk() {
        echo 'a';
    }

    public function bigTalk() {
        echo 'A';
    }
}

trait B {
    public function smallTalk() {
        echo 'b';
    }

    public function bigTalk() {
        echo 'B';
    }
}

class Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}

class Aliased_Talker {
    use A, B {
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as talk;
    }
}

所以你的情况可能是

class Boo {
    use FooTrait, TooTrait {
        FooTrait::getRow insteadof TooTrait;
    }

    public function booMethod() {
        return $this->fooMethod();
    }
}

即使您分开也可以使用use,但是我认为更清楚

或使用as来声明别名。

是的,这是可能的,您可以使用类似以下内容(已编辑内容的答案):

class Boo {
    use FooTrait, TooTrait {
        FooTrait::getRow as getFooRow;
        TooTrait::getRow as getTooRow;
    }

    public function getRow(... $arguments)
    {
         return [ 'foo' => $this->getFooRow(... $arguments), 'too' => $this->getTooRow(... $arguments) ];
    }

    public function booMethod(... $arguments)
    {
        return $this->getFooRow(... $arguments);
    }
}
本文地址:http://php.askforanswer.com/yuqitatezhengfangfadepengzhuang.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!