例2從PHP手冊http://php.net/manual/en/language.oop5.traits.php狀態PHP trait:有沒有一種合適的方法來確保使用特徵的類擴展了一個包含特定方法的超類?
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
這是正確的代碼,但它不是安全在這方面使用parent::
。比方說,我寫我自己的「Hello World」類沒有繼承任何其他類:直到我稱之爲sayHello()
方法
<?php
class MyOwnHelloWorld
{
use SayWorld;
}
?>
此代碼不會產生任何錯誤。這不好。
另一方面,如果性狀需要使用某種方法我可以寫這個方法爲摘要,這是很好的,因爲它可以確保特徵在編譯時正確使用。但是,這並不適用於父類:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
所以我的問題是:有沒有一種方法,以確保(在編譯時,而不是在運行時),它採用某些性狀將有parent::sayHello()
方法這門課嗎?
你可以做的是添加一個抽象方法來強制使用該特徵的類具有所需的方法。這樣它變得獨立於類層次結構(特質背後的想法:P) – Jarry