如果您使用 VSCode 开发 PHP,请使用功能最强大的 IntelliSense 工具——IntelliSense。

大家好,
我是开发团队野生队的成员 Mandai。
今年我一直在从事 PHP 开发工作,在环境搭建方面也经历了不少摸索和尝试。正因如此
,我才得以搭建出一套相当实用的系统,所以我想写篇文章来总结一下。
使用 Visual Studio Code 进行 PHP 开发
当我第一次开始使用 Visual Studio Code(以下简称 VSCode)进行开发时,我有一些顾虑。
实际上,在开始开发之前,我们曾考虑引入 PhpStorm,但我们放弃了这个想法。
因为它是一款专为 PHP 开发而开发的 IDE,我觉得它的功能非常完善,但我就是不习惯它的图形用户界面。
这虽然是个小问题,但考虑到我要用它一年多,我觉得界面外观很重要。
这就是为什么我决定使用 VSCode 进行开发的原因,但是 VSCode 只是一个没有扩展的时尚记事本,所以无法进行大规模开发。
虽然有原生的 PHP 支持,但总比没有强,所以我继续寻找像 PhpStorm 一样强大的扩展,然后找到了 intelephense。
如果你想了解详情,我建议阅读Langserver.org
代码自动补全和代码跳转的速度之快令人印象深刻。
此外,在此开发过程中,我们精心编写了 PHPDoc 和类型提示,这很有帮助,而且我们能够立即获得诸如参数类型不正确之类的警告,这很好。
即便如此,我仍然很难正确地跳转到代码中,所以我在研究的同时尝试了各种方法,但可用的信息很少,我无法轻易解决这个问题,所以我想分享一些我积累的知识。
请确保设置正确
GitHub - bmewburn/vscode-intelephense:如 Visual Studio Code 的 PHP 智能感知中所述,这将禁用 VSCode 的标准 PHP 支持。
这会导致重复的代码补全,没有任何好处。
PHP IntelliSense (与 PHP 智能感知相同),则会出现三个提示,这会使它更加烦人。
尽可能多地编写类型提示
你编写的类型提示越多,电话检测的效果就越好,所以最好尽可能多地编写类型提示。
从 PHP7 开始,你可以为返回值编写类型提示,所以我们也来编写一下。
/** * 不使用类型提示 */ function square($number) { if (is_array($number)) { $sum = 0; foreach ($number as $n) { $sum+= $n; } return $sum; } return null; }
上面的代码没有类型提示,但除非你理解代码的处理过程,否则你无法确定参数应该设置什么值。
如果添加类型提示,代码将如下所示:
/** * 带类型提示 */ function square(array $number): ?float { if (is_array($number)) { $sum = 0; foreach ($number as $n) { $sum+= $n; } return $sum; } return null; }
这是一个比较极端的例子,但通过类型提示,无需读取内容即可确定参数类型,并且可以立即清楚地知道将返回什么值。
Intellephense 会显示方法声明和方法前面编写的 PHPDoc,这样就不用逐一检查了,非常方便。
正确定义类属性
以下是 AwesomeService 类的单元测试的开头部分:
class AwesomeServiceTest { protected $awesomeService; public function setUp() { $this->awesomeService = $this->app->make(AwesomeService::class); } // 其余部分省略 }
为了避免与其他测试相互影响,我们将为每个测试创建一个新的 AwesomeService 类。在这种情况下,我们会编写许多类似 `$this->awesomeService->awesomeMethod()` 的方法,这时代码自动补全功能就派上用场了。遗憾的是,上面的代码中代码自动补全功能无法正常工作。
在这种情况下,您可以通过指定类属性的类型来启用代码自动完成功能。
以下代码添加了一条注释以启用代码自动完成功能。
class AwesomeServiceTest { /** @var AwesomeService */ protected $awesomeService; public function setUp() { $this->awesomeService = $this->app->make(AwesomeService::class); } // 以下代码已省略 }
看来 PhpStorm 和其他程序中的代码补全功能工作方式类似,因此无论在何种环境下,这都是一个能让每个人都感到高兴的实用功能。
局部变量的类型也正确。
虽然我已经很接近问题的核心,但我仍然无法找到问题的症结所在,那就是如何指定局部变量的类型。不过,我想如果你直接查看代码,应该会更容易理解,所以这里提供一个示例。
function superMethod() { $awesomeService = $this->app->make(AwesomeService::class); $awesomeService->awesomeMethod(); }
在这种情况下,Intellense 无法完成 awesomeMethod() 的执行,因为它不知道 $awesomeService 的类型。
因此,我们将使用 @var 来指定局部变量的类型,以便执行功能能够正常工作。
function superMethod() { /** @var AwesomeService $awesomeService */ $awesomeService = $this->app->make(AwesomeService::class); $awesomeService->awesomeMethod(); }
基本概念与类属性相同,但关键在于将变量名放在类名之后。
仔细想想,它的写法与 `@param` 类似,但我花了很长时间才明白这一点,因为它写在类定义之前,而且是在类本身内部,这与 `@param` 不同。
随着开发规模的扩大,方法名往往会越来越长(这是我的个人看法),所以我希望确保采取这一额外的步骤。
概括
这次我们学习了如何使用 Intelephene,这是一个在 VSCode 中进行 PHP 开发的强大工具。
虽然我个人很喜欢这个扩展,但要收集有关 PHP 开发扩展的信息却困难得多,所以我整理了一些关于如何使用它的有用信息,希望能稍微降低入门门槛。
我写过很多让开发更轻松的技巧,但归根结底,还是要养成每天在代码中编写文档的习惯。
如果发现其他有用的功能,我会添加更多。
最后
我是系统开发服务网站“SEKARAKU Lab”的成员。Beyond
提供从服务器设计、搭建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab: [https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)
就这样。
1