我花了很多时间阅读PHPStan文档和尝试,但是我不明白如何让PHPStan在这段代码中检测到子类,甚至可能.
<?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
谢谢你的帮助!
发布于 2022-10-09 18:09:52
根据PHPStan的创始人(参见Github讨论):
实现这一目标的唯一方法是使用泛型:https://phpstan.org/r/5ed2bf49-e9fe-43b6-b279-182458ff358a
<?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 Foofoohttps://stackoverflow.com/questions/71794955
复制相似问题