在 PHP 中对特征使用 final

Use final on traits in PHP

我想要的是 "final traits" 具有如下所述的行为的能力。我意识到这对于 traits 是不可能的(或者是吗?这会让我很高兴),但我只是想传达我想做的事情。

所以,我想要的特质是

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

我要的是

将 traits 中的函数标记为 final 确保如果 class 使用此 trait,则 trait 实现是有保证的实现

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

我希望能够以某种方式检查 class 是否使用特征(即 $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)"

确保在使用特征时,方法name/visibility不能更改。因此,应该允许 none。

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

特征中的方法被class中定义的方法覆盖,即使特征方法是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

查看 traits 文档中的 precedence section

An inherited member from a base class is overridden by a member inserted by a Trait. The precedence order is that members from the current class override Trait methods, which in turn override inherited methods.