Trait 中的 insteadof 关键字如何工作

How does insteadof keyword in a Trait work

我刚刚阅读了有关 traits 的内容,以及如何在同一个 php 代码中使用多个 php traits,并用逗号分隔。但是,我不理解用于在两个特征具有相同功能的情况下解决冲突的 insteadof 关键字的概念。任何人都可以解释 insteadof 关键字是如何工作的以及如何使用它来告诉引擎我愿意使用特征 A 的函数 hello() 而不是特征 B 的函数,因为有两个特征 A 和 B 以及一个函数 hello( ) 在两个特征中。

说明

根据Traits Documentation,当你在多个trait中有相同的方法时,那么你可以通过使用insteadof运算符明确地引导程序使用特定trait的方法。参考下面的例子,它是从上面link借来的,这里,当$t->smallTalk()被调用时,它调用trait B中的smallTalk方法而不是trait A,这正是insteof运算符已用于此处。由于 Class Talker 使用特征 A、B 并且两个特征都有 smallTalk() 方法,我们明确告诉它使用特征 B 的 smallTalk.

例子

<?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;
    }
}

$t = new Talker;
$t->smallTalk();
$t->bigTalk();

输出

bA

我希望这已经消除了您的困惑。