【发布时间】:2020-06-18 08:47:41
【问题描述】:
是否可以在函数调用期间直接内联键入提示参数?
public function load(ObjectManager $manager)
{
$product = $this->createProduct(
"T-SHIRT",
$this->getReference('brand-4') /** @var Brand <=== NOT WORKING */
);
$manager->persist($product);
$this->addReference('product-1', $product);
}
/**
* @param string $name
* @param Brand $brand
*/
private function createProduct($name, $brand)
{
$product = new Product();
$product
->setName($name)
->setBrand($brand) // <== this setter needs a Brand entity
;
// [...]
}
当然 phpstan 给了我一个错误,因为 getReference 返回一个对象,而函数需要一个 Brand 对象:
Parameter #2 $brand of method AppBundle\DataFixtures\ORM\ProductFixtures::createProduct() expects AppBundle\Entity\Brand, object given.
我希望不像这样显式声明一个变量:
/** @var Brand */
$brand = $this->getReference('brand-4');
$product = $this->createProduct(
"T-SHIRT",
$brand
);
这会节省我很多时间!
【问题讨论】:
-
为什么不改变
createProduct提示? -
因为
createProduct将在新创建的Product对象上调用setBrand,并且它需要一个Brand实体。 -
我明白了,
getReference根据引用返回了各种类型的类,所以你不能提示它的返回类型。但是你确定它会从brand-4返回一个Brand对象,所以你需要一种方法来提示这种类型。 -
@bravemaster 完全正确!
-
一种解决方法是无论如何更改
createProduct提示,并在其中使用instanceof来断言您有一个Brand,但我想这并不比定义一个变量好多少。另一方面,它可以让您确保getReference的返回确实是Brand并管理错误。
标签: php phpdoc type-hinting phpstan