数组中的 VS Code PHP Intelephense 对象未显示属性和函数 -> 运算符

问题描述

我是 VS Code 的新手,所以我不知道这里发生了什么。 我有一个全新的 Intelephense 安装,并禁用了基本的 PHP 建议,但是当我输入一个数组时,其中是对象,在我输入 -> 运算符后,对象属性函数没有显示在建议中。

有没有办法让它工作?

示例:

programcomments

编辑:这就是我在一个充满对象的数组中读取的方式。问题是,当我输入 $array[$i] -> property1 = 'Random' 行时,它没有给出建议。

当我输入最后一行时,在输入 -> 运算符之后,我希望 Intelephense 列出类 newClass 的所有属性函数。但事实并非如此。
另外,我使用的是普通数组,因为根据官方手册,objectArray 不支持 foreach。因此,对我来说,是没有用的。

提前致谢。 :)

解决方法

来自PHP documentation on arrays

[of an array] 的键可以是 int 或 string。值可以是任何类型。

例如,我们可以有:

$obj1 = new MyClass;
$my_array[0] = $obj1;

但是,由于存储在数组中的值可以是任何类型,因此没有什么可以阻止我们做类似的事情,比如:

$my_array[1] = "hello";
$my_array[2] = 5;

这使得编辑器很难推断 $my_array[0] 包含一个(指向)MyClass 类型的对象。

但是,由于您已经有 $obj1 指向这样的实例,因此在您输入 $obj1-> 后,编辑器应该能够给出很好的建议。然后,由于 $obj1$my_array[0] 指向同一个对象,通过 $obj1 进行的任何编辑都会影响 $my_array[0] 指向的对象。

只有 PHP Intelephense 处于活动状态,VS Code 给出以下建议:

screenshot showing suggestions

所以:

<?php

class MyClass
{
    public $property1;
    public $property2;
}

$obj1 = new MyClass;
$my_array[0] = $obj1;
$obj1->property1 = "Random";
$obj1->property2 = "Another";
echo $my_array[0]->property1 . "<br>" . $my_array[0]->property2;

会给我们这些设置,即使它们是通过(指针)$obj1 设置并通过(指针)$my_array[0] 显示的。

话虽如此,我们可以使用 DocBlock 类型提示让编辑器知道我们的意图。例如,如果我们有:

/** @var MyClass[] */
$my_array[0] = $obj1;

然后编辑器也可以提供有关数组的有用建议:

code completion on array

有关详细信息,请参阅 this phpDocumentor page on DocBlocks