我想要的是能够做出最终特质"具有如下所述的行为。我意识到这是不可能的特征(或者是它会让我如此开心),但我只想传达我想做的事情。
所以,我想要一个
的特征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
}
}
答案 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方法,后者又覆盖继承的方法。