PHPDoc用于条件多态调用

knsnq2tg  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(102)

对于$item,存在多态loggable关系。在数据库中,它被存储在items中,作为loggable_typeloggable_id(对于PHP 8+和Laravel)。

for($items as $item) {
    // ...

    if ($item->loggable_type === Comment::class) {
        $item->loggable->resetDates();
    }

    // ...
}

字符串
我尝试输入提示,条件中的loggableComment。我想我可能可以使用@var,但做一些像/* @var $item->loggable Comment */不工作,我不能做/* @var $item Comment */,因为它设置为$item,而不是它的属性。
我正在考虑将条件更改为if ($item->loggable instance of Comment),但我宁愿不这样做,因为即使不使用,也需要加载和创建注解。
有没有办法把hint $item->loggable写成Comment

j9per5c4

j9per5c41#

将其赋值给变量

for($items as $item) {
    if ($item->loggable_type === Comment::class) {
        /** @var Comment $loggable */
        $loggable = $item->loggable;
        
        $loggable->resetDates();
    }
}

字符串

gjmwrych

gjmwrych2#

正如@Justinas所说,将其分配给一个变量:

for ($items as $item) {
    if ($item->loggable_type === Comment::class) {
        /** @var Comment $loggable */
        $loggable = $item->loggable;
        
        $loggable->resetDates();
    }
}

字符串
或者在模型本身上设置可能的值(如果它们是固定的和已知的),如下所示:

/**
 * @property Comment|WhateverModel|Model $loggable
 */
class Item extends Model
{
   // ...
}


这将告诉IDE属性loggable可能是Comment对象、WhateverModel对象或Model对象(因此您仍然可以使用普通Model的方法自动完成)。
如果您可以缩小您可以在那里拥有的类的范围,那么添加它们,否则我将使用第一个选项(分配一个值并使用PHPDoc块作为变量)

相关问题