使用traits取代多重继承没有PHP的角色?

时间:2016-10-05 17:32:53

标签: php traits

如果我使用两个不同特征的类,并且两个方法都具有相同名称但该方法的不同实现方式会发生什么?

1 个答案:

答案 0 :(得分:1)

简短回答

enter image description here(c)AbraCadaver

答案很长

假设你有一个使用 A B 特征的 Foo 类:

class Foo {
    use A, B;
}

两个特征都有一个名称相似但实现不同的方法(实现并不重要):

trait A {
    public function bar() {
        return true;
    }
}

trait B {
    public function bar() {
        return false;
    }

Traits通过水平扩展类来工作。简单地说 - 只需在课堂上添加任何新内容即可。一切正常,直到特质方法和属性加倍。如果未明确解决此冲突,那么您自己会遇到致命错误。

甜蜜的部分是,你可以通过指定使用特征的方法来解决这个冲突:

class Foo {
    use A, B {
        B::bar insteadof A;
    }
}

您也可以使用别名来保存其他方法:

class Foo {
    use A, B {
        B::bar insteadof A;
        A::bar as barOfA;
    }
}

manual的特征记录非常清楚,请查看。