1

是否可以在函数调用期间直接内联输入提示参数?

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
);

它会为我节省很多时间!

4

1 回答 1

1

我在实现类似结构的通用结构时遇到了同样的问题。当您想要覆盖方法签名时,此解决方案有效。您可以使用@method文档注释来完成此操作,但您需要 2 个类:

class AbstractRepository {
  /**
   * @param mixed $id
   * @return object
   */
  public function getReference($id) {
     /* ... */
  }
}

/**
 * @method ConcreteResult getReference($id)
 */
class ConcreteRepository extends AbstractRepository {

}

$repo = new ConcreteRepository();
$repo->getReference(123); // Has ConcreteResult return type

例如,这适用于 PHPStorm。我没有检查它是否适用于 PHPStan。

于 2021-06-30T14:22:57.017 回答