【问题标题】:PHP type hinting inline when calling a function调用函数时内联 PHP 类型提示
【发布时间】: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


【解决方案1】:

我在实现类似通用的结构时遇到了同样的问题。 当您想要覆盖方法签名时,此解决方案有效。 您可以使用@method doc cmets 完成此操作,但您需要 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2022-12-22
    • 2014-03-04
    • 2021-12-08
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多