Php:如果你不能编辑基类,如何优雅地添加一个新方法


Php: how to elegantly add a new method if you cant edit the base class?

假设我有表单输入:

TextArea -> Input -> InputBase
Checkbox -> InputBase
RadioGroup -> InputBase
Password -> Input -> InputBase

他们是不可触碰的阶层。但是这次我想添加一个新的函数。例如"echo CSS类属性"和一个新字段(数字)。通常我会添加到InputBase,但这次不是一个选项。我可以正常地这样做:

Numeric -> Input -> InputBase

在哪里添加我的自定义功能?我可以写:

Numeric -> MyCustomFunctionallityClass -?> InputBase
                                       -?> Input

但是MyCustomFunctionallityClass必须继承InputBase,因此它失去了Input特性。

您可以查找特征。

特性是在PHP等单一继承语言中重用代码的一种机制。Trait旨在通过使开发人员能够在生活在不同类层次结构中的几个独立类中自由重用方法集来减少单一继承的一些限制。Traits和类组合的语义是以一种降低复杂性的方式定义的,并避免了与多重继承和Mixin相关的典型问题。

所以,你可以有:

trait Hello {
    public function sayHello() { echo 'Hello ';}
}
trait World {
    public function sayWorld() { echo 'World'; }
}
class MyHelloWorld {
    use Hello, World;
    public function sayExclamationMark() {
        echo '!';
    }
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
// outputs 'Hello World!'