在PHP中使用final的traits

时间:2015-11-02 15:17:50

标签: php oop traits

我想要的是能够做出最终特质"具有如下所述的行为。我意识到这是不可能的特征(或者是它会让我如此开心),但我只想传达我想做的事情。

所以,我想要一个

的特征
trait Content {
    public final function getPostContent(){ /*...*/ }
    public final function setPostContent($content){ /*...*/ }
}

我想要的是

将特征中的函数标记为最终确保如果类使用此特征,则特征实现是有保证的实现

class MyClass {
    use Content;
    public function getPostContent() { // This should not be allowed
        return null;
    }
}

我希望能够以某种方式检查某个类是否使用了特征(即$ myObject instanceof Content)

class MyClass {}
class MyClassWithContent {
    use Content;
}
var_dump((new MyClass) instanceof Content); // "bool(false)"
var_dump((new MyClassWithContent) instanceof Content; // "bool(true)"

确保在使用特征时,无法更改方法名称/可见性。所以,这一切都不应该被允许。

class MyDeceptiveClass {
    use Content {
        Content::getPostContent as nowItsNotCalledGetPostContentAnymore();
        Content::setPostContent as protected; // And now setPostContent is protected
    }
}

1 个答案:

答案 0 :(得分:3)

特征中的方法会被类中定义的方法覆盖,即使特征方法是final

<?php
trait Bar {
    final public function fizz() {
        echo "buzz\n";
    }
}

class Baz {
    use Bar;

    public function fizz() {
        echo "bam\n";
    }
}

$x = new Baz;
$x->fizz(); // bam

查看特征文档中的precedence section

  

来自基类的继承成员被Trait插入的成员覆盖。优先顺序是当前类的成员覆盖Trait方法,后者又覆盖继承的方法。