是否依赖 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_Truck
或 GenericTruck
等),但是那是你的决定。
依赖 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 而不是变量 类 名称来实例化您的对象,这通常被认为更干净。
我有 运行 在多种情况下我非常想要自动完成,但指定 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_Truck
或 GenericTruck
等),但是那是你的决定。
依赖 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 而不是变量 类 名称来实例化您的对象,这通常被认为更干净。