是否依赖 PHPDoc?有没有更好的类型提示?

Rely on PHPDoc or not? Is there any better type hinting?

我有 运行 在多种情况下我非常想要自动完成,但指定 class 类型的唯一方法是编写 PHPDoc。这种方法只是闻起来不好,还是我将来会遇到一些严重的问题?这是需要 PHPDoc 的代码:

    /** @var genericTruck $pageObject */
    $pageObject = new $pageClass();

    echo $pageObject->drive();

$pageClass 是字符串,可以包含 class 继承自 genericTruck class 的名称。然后我需要从那个 superclass

调用方法
    /** @var truckViewModel $model */
    foreach ($this->view as $model)
    {
        echo "<tr>
                <td>$model->name</td>
                <td><img src='$model->photo'/></td>
            </tr>";
    } 

这里 $this->view 是一个数组,其中 truckViewModel 实例由 array_push 放在另一个 class 方法中。

这正是您应该做的。在 $pageObject 是变量类型的情况下,您应该暗示所有类型都将扩展或实现的共同祖先或接口。

我不确定 genericTruck 是否尽可能遵循 class 命名约定标准(根据大多数指南,应该是 Generic_TruckGenericTruck 等),但是那是你的决定。

依赖 PHPDoc 进行类型提示或指导并没有什么奇怪或可疑的地方。使用它是一种常见的做法,它不会很快消失。

您可以这样输入提示;但是有更好的方法来记录您要实现的目标。

大概 $pageClass 被注入到某个地方,除非您对此进行了验证,否则任何调用代码都可以注入其他东西。例如,您可能期望一些基本类型 Model 但得到的却是 CompletelyUnrelatedClass,因此您的 $pageObject` 相当不可靠。

在这种情况下,您最好在基本界面上进行类型提示,该界面展示了您的 function/object 工作所需的最低行为。

这是一个人为的例子

class MyClass{
  public function doDrivingWith(\MyCode\DrivableInterface $drivable)
  {
    //... do things with $drivable.
  }

  //... or with your specific example:
  public function renderSomething() {
    /* @var \MyCode\RenderableInterface $pageObject */
    $pageObject = new $pageClass;
    // $pageObject->anyRenderableMethods(); // only call methods from the interface.
  }
}

理论上,您的代码应该只调用 DrivableInterface 定义的方法。

这导致能够使用 dependency injection 而不是变量 类 名称来实例化您的对象,这通常被认为更干净。