如何使自动完成在 foreach php 循环中工作? (vscode, 智能感知)

How to make autocomplete work in foreach php loop? (vscode, intellisense)

我正在使用 vscode 和 php 扩展包(它包含最常用的扩展)。我想在此 foreach 循环中使用智能感知:

foreach ($list_of_objs as $obj) {
    /* @var $obj my_class_name */
    // I want to go to definition of obj_method()
    //  with F12 but it's not working
    //  also auto-complete is not working
    $obj->obj_method();
}

如果你能解决这个问题,请给点建议。我找到了 Zend Studio 的解决方案,但没有找到 vscode 的解决方案。

是否有扩展来支持代码中任何地方的文档块类型提示?会很好:

/** @var my_class_name */
$my_variable;

据我所知,在php7 中,变量类型的唯一位置是在函数声明中。 PHP IntelliSense 也理解

$obj = new ClassName;

(至少祝福他们......)

经过大量搜索我没有找到一个简单的解决方案,我想出了这个可行的解决方案:

在你的class中创建一个静态函数

/**
 * Returns the instance itself for Code completion
 * @return ClassName
 */
public static function self($instance) {
    return $instance;
}

这样你就可以拥有一个类型如下的实例:

foreach ($list_of_objs as $obj) {
    $obj = ClassName::self($obj);
    $obj->obj_method()
}

如果 foreach 中的注释有效,那会更好,但至少它是一种使用代码完成的方法。

你一直在努力 Eclipse/Zend type annotations:

/* @var $obj my_class_name */
$obj->obj_method();

支持它们的编辑器已经不多了。今天的实际标准似乎是:

/** @var my_class_name $obj */
$obj->obj_method();

我可能是错的,但我相信 PHP IntelliSense does not support either anyway (please try and report back). I can confirm that PHP Intelephense 确实支持后者。

试试这个,对我有用

将其添加到 foreach 的顶部

/** @var post $post */

例如

/** @var post $post */
foreach($res_class as $post)
{
   // you can use auto complete in vscode
   $post
}