我正在实现一个适配器模式用于测试目的,并且我想使用两个不同类的方法来提示适配器的返回,我怎样才能实现这一点?
class Foo {
public function somethingOnlyFooHave() {};
}
class Adapter {
protected $handler;
public function __construct(object $handler) {
$this->handler = $handler;
}
public function __call($name, ...$args) {
$this->handler->$name($args);
}
public function somethingOnlyTheAdapterHave() {}
}
$foo = new Adapter(new Foo);
// How can I get type-hinting for both the Adapter and Foo?
$foo->somethingOnlyFooHave();
$foo->somethingOnlyTheAdapterHave();
似乎 PHP 本身无法执行此操作,但如果您使用 PHPStorm 2018.3+,则可以使用联合类型(或交集类型),只要它不在
__construct
上即可:
class Foo {
public function somethingOnlyFooHave() {}
}
class Adapter {
protected $handler;
public function __construct(object $handler) {
$this->handler = $handler;
}
public function __call($name, ...$args) {
$this->handler->$name($args);
}
/**
* @return Adapter|Foo
*/
public function get() {
return $this;
}
public function somethingOnlyAdapterHave() {}
}
$foo_adapter = ( new Adapter(new Foo) )->get();
// The following methods receives type-hinting:
$foo_adapter->somethingOnlyFooHave();
$foo_adapter->somethingOnlyAdapterHave();
有用的链接:
老实说,这就是为什么适配器模式通常被视为反模式,而策略是首选模式 - 适配器可能会让您陷入各种问题:)
但是,如上所述 - 使用最新版本的 PHP,您现在可以使用联合类型,并键入两个类返回值。然而,从代码稳定性的角度来看,让每个适配器实现一个接口并键入该接口会更好。