【问题标题】:Is there a way to indicate that a class has magic methods defined for every method on another class?有没有办法表明一个类为另一个类的每个方法定义了魔法方法?
【发布时间】:2017-03-21 06:13:15
【问题描述】:

有没有办法证明某个类对另一个类中定义的每个方法都有神奇的方法?

我正在使用 PhpStorm,所以我对任何可以让自动完成功能正常工作的解决方案都很满意。

class A
{
    // a bunch of functions go here...
}

/**
 * Class B
 * What should go here to make it work???
 */
class B
{
    private $aInstance;

public function __construct() {
    $this->aInstance = new A();
}

public function __call($name, $arguments) {
    // TODO: Implement __call() method.
    if(method_exists($this->aInstance, $name)) {
        return $this->aInstance->{$name}(...$arguments);
    }
    throw new BadMethodCallException();
}

    // a bunch more functions go here...
}

【问题讨论】:

  • 我认为 $this->aInstance->{$name}(...$arguments); 在 PHP 7.0 及更高版本中已被弃用。可能需要在那里使用call_user_func
  • 另外,为什么B 不能扩展A?轻松解决问题
  • B 已经有一个父母。
  • 嗯,你试过类似这个问题的东西吗? stackoverflow.com/questions/15634021/…
  • 通过 PHPDoc 执行此操作的唯一方法是通过 @method 手动列出每个方法,如上一条评论中所述(将在支持它的其他编辑器/IDE 中工作)。虽然在 PhpStorm 中 @mixin className 也可以工作..这可能会为您完成这项工作。

标签: php phpstorm phpdoc


【解决方案1】:

正确的解决方案是使用受支持的@method PHPDoc 标签。这样它也可以在支持 PHPDoc 并理解此类标准标签的其他编辑器/IDE 中工作。

这种方法需要单独列出每个方法。在另一个 StackOverflow 问题/答案中了解更多信息:https://stackoverflow.com/a/15634488/783119


在当前的 PhpStorm 版本中,您可以使用非 PHPDoc-specs(因此可能是 PhpStorm 特定的)@mixin 标签。

在 PHPDoc 注释中为您的目标类添加 @mixing className 应该可以为您完成这项工作。

/**
 * Class B
 * 
 * @mixin A
 */
class B
{

基本上,@mixin 标签的作用与实际 PHP 的特征一样。

请注意,虽然不太可能,但不能保证将来某个时候不会删除对此类标签的支持。

【讨论】:

    猜你喜欢
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多