【问题标题】:Is it possible for PhpStorm to infer the return type of this method?PhpStorm 是否可以推断此方法的返回类型?
【发布时间】:2016-03-25 09:29:48
【问题描述】:

我想我可能需要在某处添加一个特殊的注释,但我很担心 PhpStorm 足够聪明,可以解决给定笨拙的继承模式的返回类型。

例如,我有一些类似这样的代码:

<?php

class Collection extends \ArrayObject
{
    public function __construct(array $items)
    {
        foreach ($items as $key => $value) {
            if (isset(static::$requiredType) && !$item instanceof static::$requiredType)
                $this->offsetSet($key, $value);
        }
    }

    public function getFirst()
    {
        return $this->offsetGet(0);
    }
}

class MessageCollection extends Collection
{
    protected static $requiredType = 'Message';
}

class UserCollection extends Collection
{
    protected static $requiredType = 'User';
}

我希望当我调用 UserCollection::getFirst() 时它推断出 User 已返回,而当我调用 MessageCollection::getFirst() 时它推断出 Message 已返回。我可以在某处放置一些注释来实现此结果吗?

我的第一个想法是这样的:

    /**
     * @return Message|User|XXXX|YYYY|ZZZZ|AAAA|BBBB|CCCC|DDDD
     */
    public function getFirst()
    {
        return $this->offsetGet(0);
    }

但我想随着我添加更多集合类,这会变得有点荒谬到无用的地步。

【问题讨论】:

    标签: phpstorm phpdoc


    【解决方案1】:

    试试这个:

    /**
     * @method \User getFirst()
     */
    class UserCollection extends Collection
    {
        protected static $requiredType = 'User';
    }
    

    【讨论】:

    • 我喜欢这个想法。 foreach 循环也可以使用类似的注释吗?
    • 你可以为 foreach 使用类似这样的东西:/** @var \User[] $items */.
    • 我不知道每次我写一个foreach循环时在我的代码中乱扔cmet是什么感觉......
    • 你可以定义方法的返回类型,返回集合为 foreach 。像这样:@return \User[]。如果你能用foreach展示例子,也许我可以给它建议。
    • 啊!弄清楚了。如果您使用类注解@method User offsetGet($offset),那么foreach ($userCollection as $user) 将推断出$user 的正确类型。
    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 2022-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2021-06-11
    • 1970-01-01
    相关资源
    最近更新 更多