【发布时间】:2012-10-11 17:47:38
【问题描述】:
来自 PHP 手册 http://php.net/manual/en/language.oop5.traits.php 状态的示例 #2
<?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”类,它不继承任何其他类:
<?php
class MyOwnHelloWorld
{
use SayWorld;
}
?>
在我调用sayHello() 方法之前,此代码不会产生任何错误。这很糟糕。
另一方面,如果 trait 需要使用某个方法 我可以把这个方法写成抽象的,这样很好,因为它可以确保在编译时正确使用 trait。但这不适用于父类:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
所以我的问题是:有没有办法确保(在编译时,而不是在运行时)使用特定特征的类将具有 parent::sayHello() 方法?
【问题讨论】:
-
您可以做的是添加一个抽象方法来强制使用该特征的类具有您需要的方法。这样它就变得独立于类层次结构(特征背后的想法:P)
标签: php class inheritance superclass traits