首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHPStan :如何返回子类型,而不是父类型

PHPStan :如何返回子类型,而不是父类型
EN

Stack Overflow用户
提问于 2022-04-08 09:50:54
回答 1查看 126关注 0票数 1

我花了很多时间阅读PHPStan文档和尝试,但是我不明白如何让PHPStan在这段代码中检测到子类,甚至可能.

代码语言:javascript
复制
<?php declare(strict_types = 1);

abstract class Bar {}
    
class Foo extends Bar 
{
}
    
class Foofoo extends Bar 
{
}
    
class Baz
{
    private Bar $_bar;
        
    /**
     * @param Bar $bar
     *
     * @return void
     */
    public function setBar(Bar $bar)
    {
        $this->_bar=$bar;
    }
    
    /**
     *
     * @return Bar
     */
    public function bar(): Bar
    {
        return $this->_bar;
    }
}
   
$baz=new Baz();
$baz->setBar(new Foo());
\PHPStan\dumpType($baz->bar());     // return type is Bar, I would like Foo
$baz->setBar(new Foofoo());
\PHPStan\dumpType($baz->bar());     // return type is Bar, I would like Foofoo

到操场的链接:https://phpstan.org/r/53aebcc3-717b-445c-8715-0f277151270b

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2022-10-09 18:09:52

根据PHPStan的创始人(参见Github讨论):

实现这一目标的唯一方法是使用泛型:https://phpstan.org/r/5ed2bf49-e9fe-43b6-b279-182458ff358a

代码语言:javascript
复制
<?php declare(strict_types = 1);

abstract class Bar {
}

class Foo extends Bar 
{
}

class Foofoo extends Bar 
{
}

/** @template T of Bar */
class Baz {
    private Bar $_bar;

    /**
     * @param T $bar
     *
     * @return void
     */
    public function setBar(Bar $bar)
    {
        $this->_bar=$bar;
    }
    
    /**
    *
    * @return T
    */
    public function bar(): Bar
    {
        return $this->_bar;
    }
}

/** @var Baz<Foo> */
$baz=new Baz();
$baz->setBar(new Foo());
\PHPStan\dumpType($baz->bar());     // return type is Bar, I would like Foo
$baz->setBar(new Foofoo());
\PHPStan\dumpType($baz->bar());     // return type is Bar, I would like Foofoo
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71794955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档