Mac*_* Sz 18 php inheritance class traits superclass
实施例#2从PHP手册http://php.net/manual/en/language.oop5.traits.php状态
<?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();
?>
Run Code Online (Sandbox Code Playgroud)
这是正确的代码,但parent::
在该上下文中使用是不安全的.假设我写了自己的'hello world'类,它不继承任何其他类:
<?php
class MyOwnHelloWorld
{
use SayWorld;
}
?>
Run Code Online (Sandbox Code Playgroud)
在调用sayHello()
方法之前,此代码不会产生任何错误.这是不好的.
另一方面,如果特征需要使用某种方法,我可以将此方法编写为抽象,这很好,因为它确保在编译时正确使用特征.但这不适用于父类:
<?php
trait SayWorld
{
public function sayHelloWorld()
{
$this->sayHello();
echo 'World!';
}
public abstract function sayHello(); // compile-time safety
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有没有办法确保(在编译时,而不是在运行时)使用某个特征的类将有parent::sayHello()
方法?
不,那里没有。事实上,这个例子很糟糕,因为引入特征的目的是向许多类引入相同的功能而不依赖继承,而使用parent
不仅要求类有父类,而且还应该有特定的方法。
附带说明一下,在parent
编译时不会检查调用,您可以定义简单的类,该类不会在其方法中使用父调用扩展任何内容,直到调用其中一个方法为止,它将一直工作。
归档时间: |
|
查看次数: |
10063 次 |
最近记录: |