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

时间:2016-01-10 20:50:57

标签: php phpdoc

我在多种情况下运行,我想要自动完成自动完成,但只有指定类的类型才能编写PHPDoc。这种方法是不是很难闻,或者我将来会遇到一些严重的问题?以下是需要PHPDoc的代码:

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

    echo $pageObject->drive();
$ pageClass是字符串,可以包含从genericTruck类继承的类名。然后我需要调用超类

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

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

2 个答案:

答案 0 :(得分:0)

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

据推测,$pageClass被注入某个地方,除非你对此进行验证,否则任何调用代码都会注入其他内容。例如,您可能期望某些基类型为Model,而是给予CompletelyUnrelatedClass,因此您的$ pageObject`相当不可靠。

在这种情况下,您最好在基本界面上进行类型提示,该界面显示您的函数/对象的最小行为。

这是一个人为的例子

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而不是变量类名称来实例化通常被认为更清晰的对象的方式。

答案 1 :(得分:-1)

这正是你应该怎么做的。对于$pageObject,它是一个变量类型,你应该提示一个所有类型都会扩展或实现的共同祖先或接口。

我不确定genericTruck是否遵循类命名约定标准(根据大多数准则应该Generic_TruckGenericTruck等),但这是您的决定。

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