在 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.
我想要的是 "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.