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

大家好,
我是Mandai,Wild团队负责开发工作的成员。

我今年一直在从事 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 IntelliSense,这将禁用 VS Code 的标准 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` 相同,但写法位置不同(在类定义之前,但在类内部),所以我花了一点时间才弄明白。
随着开发规模的扩大,方法名往往会越来越长(这只是我个人的看法),所以我希望确保不会忽略这一步。

 

概括

这次我们学习了如何使用 Intelephene,这是一个在 VSCode 中进行 PHP 开发的强大工具。

虽然我个人很喜欢这个扩展,但要收集有关 PHP 开发扩展的信息却困难得多,所以我整理了一些关于如何使用它的有用信息,希望能稍微降低入门门槛。

我写过很多让开发更轻松的技巧,但归根结底,还是要养成每天在代码中编写文档的习惯。

如果发现其他有用的功能,我会添加更多。

最后

我已推出“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、构建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

就这样。

如果您觉得这篇文章对您有帮助,请点个“赞”!
1
加载中...
1票,平均分:1.00/11
74,911
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

万代洋一

我的主要工作是开发社交游戏的Web API,但幸运的是,我也有机会参与其他各种任务,包括市场营销。
我在Beyond中的图像版权采用CC0协议。