1

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

有没有办法让它工作?

例子:

class newClass {
  public $property1;
  public $property2;
  public function NewFunction {
    return 'Something';
  }
}
$array = array();

for($i = 0; $i < 2; $i++ {
  $temp = new newClass;
  $temp -> property2 = 'SomeData';
  $array[$i] = $temp;
  $array[$i] -> property1 = 'Random';
  unset($temp);
}

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

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

提前致谢。:)

4

1 回答 1

1

来自数组的 PHP 文档

[数组的] 键可以是 int 或字符串。该值可以是任何类型。

因此,例如,我们可以有:

$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 给出以下建议:

显示建议的屏幕截图

所以:

<?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;

将为我们提供这些设置,即使它们是通过 (pointer) 设置并通过 (pointer)$obj1显示的$my_array[0]

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

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

那么编辑器也可以对数组提供有用的建议:

数组上的代码完成

有关更多信息,请参阅DocBlocks上的这个phpDocumentor页面

于 2021-05-08T12:43:33.480 回答