0

是否有一个有效的 Docblock 标签可以让 trait 知道它将与哪个类/接口一起使用?例如(下面是纯编的代码)。

interface Authenticatable {
    public function getId();
}

class User implements Authenticatable {
    use HasAvatar;
}

class Admin implements Authenticatable {
    use HasAvatar;
}

trait HasAvatar {
    public function getAvatarUrl() {
        return AvatarService::getAvatarUrlForId(
            $this->getId()
        );
    }
}

您可以看到来自父类的HasAvatar特征访问。getId()

但是,当您在 IDE 中时,它无法找到getId(),因为它不属于该特征,并且没有注释提示说明在哪里可以找到此方法。

因此有没有办法告诉这个特征它将以特定的方式实现?例如

/**
 * @used-by \App\Interfaces\Authenticatable
 */

这会让 IDE 知道它可以访问所有内容Authenticatable

谢谢

4

1 回答 1

1

您可以通过在 trait 中将方法声明为抽象来强制该方法的存在。然后不需要 docblock 注释,IDE 将识别该方法,如果它在某处丢失,将警告您:

trait HasAvatar {
    public function getAvatarUrl() {
        return AvatarService::getAvatarUrlForId(
            $this->getId()
        );
    }
    
    public abstract function getId();
}
于 2021-07-02T09:41:31.347 回答