如何在 PHP 中输入提示 __call() 魔术方法?

问题描述 投票:0回答:2

我正在实现一个适配器模式用于测试目的,并且我想使用两个不同类的方法来提示适配器的返回,我怎样才能实现这一点?

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 type-hinting method-call
2个回答
0
投票

似乎 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();

有用的链接:


0
投票

老实说,这就是为什么适配器模式通常被视为反模式,而策略是首选模式 - 适配器可能会让您陷入各种问题:)

但是,如上所述 - 使用最新版本的 PHP,您现在可以使用联合类型,并键入两个类返回值。然而,从代码稳定性的角度来看,让每个适配器实现一个接口并键入该接口会更好。

© www.soinside.com 2019 - 2024. All rights reserved.