Встроенные подсказки типа PHP при вызове функции

Можно ли ввести подсказку параметра непосредственно в строке во время вызова функции?

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

Это сэкономило бы мне много времени!

1 ответ

У меня была такая же проблема с реализацией такой же общей структуры. Это решение работает, когда вы хотите переопределить подпись метода. Вы можете сделать это, используя @method doc комментарии, но для этого вам нужно 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.

Другие вопросы по тегам