照片由Isaac Smith在Unsplash提供
感谢您阅读我的文章。在开始之前,我想让您考虑查看我的最新项目 FlagFox。
引言
多年来,我已经学会了拥抱可用于开发PHP和Laravel应用的众多神奇工具。我曾发了一条推文关于这一点,但似乎没有公平地解释我为什么使用这些工具的更广泛的解释。
什么是静态分析工具?
尽可能简单地解释,静态分析工具查看代码并根据其所见做出判断。在这个列表中,将包括一些工具,它们可以评分性能,发现类似未使用代码的问题,查看并改进代码的可视可读性,甚至执行代码升级。
Pint
从技术上讲,Pint是作为Laravel官方linting工具相对较新的。它可以在任何PHP项目中使用,尽管是为Laravel制作的,而且在底层使用PHP CS Fixer的情况下,它还算稍微好一些。Linting是静态分析工具的常见名称,它将格式化代码并尝试应用小更改,使代码符合一组标准。
截至撰写本文时,大多数PHP代码都将开发为众所周知的PSR-12标准,我们之前还有PSR-1和现在已被废弃的PSR-2标准。
尽管PSR编码标准并不涵盖所有内容,但通常查看可能应用的其他规则是个不错的选择。
这里的关键收获和好处是可读性和协作性。如果您是单独工作的,这并不一定会带来巨大的改进。如果您是团队合作并经常协作,这对大家都会有很大的帮助。一些PSR标准更多是为了确保代码合并时出现冲突更少。就像建立一个大家共有的规则集一样,代码将以大脑更快地看到和记忆的方式来编写。
PHPStan (& Larastan)
PHPStan 已被证明是一个对全球PHP开发者都有用的工具。PHPStan的目的是查看代码是如何交互的,例如,它可以看到一个变量的使用情况,并找出字符串变量是否将以数组参数的形式被一个函数使用。这当然会在运行时导致错误。同样,PHPStan也能找到不再使用的代码。
PHPStan非常有用,因为许多开发人员都在寻求利用PHP7和PHP8推动的前向类型提示的优点。但这并不容易做到,除非找出项目中所有没有类型提示的地方。PHPStan可以通过查找参数或返回类型没有通过类型提示或PHPDoc标签进行文档化的地方来完成这项工作。
甚至还有创建所谓的基准的强大功能,如果您想忽略过去的问题,只关注不引入新问题。
如果您正在开发一个使用Larastan的软件包或应用程序,您将想要安装Larastan而不是PHPStan。这是因为该扩展将理解Laravel中发生的更多魔法,比如模型有动态属性和作用域。
简而言之,这里的优势主要体现在早期发现错误。您设置的PHPStan级别越高,运行时发现的错误越可能被移除,也越可能避免在生产环境中痛苦地进行调试。
PHPInsights
我想说的是,总的来说,这个工具很有用,但一开始可能会有些令人不知所措。这里有许多不同的静态分析工具。 Insights 将为您提供代码、复杂度、架构和样式4组评分。
我先从风格洞察说起,这本质上将与Pint完全相同,但至少有个评分。它还会捕获一些Pint不会捕获的其他东西,比如行数。
复杂性纯粹是循环复杂度,这是一个非常简单的方式来表示代码中发生的分支数量。您可能需要了解这个概念。就我个人而言,我觉得默认值有点低,所以我通常会增加它。话虽如此,它是当类变得难以管理时的一个好指标。
这将继续到下一类架构。这涵盖了几个方面,但通常仅限于命名约定或函数或类的长度。我通常会提高允许的类长,因为我不喜欢保持如此高的标准,结果创建了大量的类来立即封装简单功能。
最后的统计数据是代码,实际上遵循了许多与PHPStan或Pint类似的东西。这些可能包括无用的变量,以及由于它们可能不可预测而避免使用某些函数。有时可能有点主观,所以如果您觉得这些规则只是给您带来了更多的噪音,请移除一些规则。
最终,我会说Insights很吸引人,它是一个很好的工具,可以快速评估代码质量,然后用这个初始得分来判断在进行代码重构时您是否朝着正确的方向前进,但您确实需要花时间形成自己对生成此类度量时所使用的规则的意见。
Rector
所以在许多方面,这个工具都是我静态分析工具套件中的新宠。它建立在PHPStan组件之上,为您提供所有类型提示的好处,但更进一步,它实际上可以修复问题。与Pint不同,Pint可以检查代码中空白结构的布局来 lint 代码,Rector 可以分析更多使用情况,并开始用后期PHP版本中新可用的运算符替换函数调用。这真是太神奇了,随着越来越多的人使用它,我们可能会开始看到世界上较少的遗留负担。
对于PHP和PHPUnit等事物,有一个直接的规则集值得使用,但还有规则可以对Laravel代码进行升级。例如,在PHP 7之前更改工厂以采用新的风格。值得一提的是,如果您正在使用Laravel,Rector中用于安装的规则曾经与Rector一起安装,但现在是在他们自己的包中维护的。
它做得相当不错,但我确实建议在使用修复合成命令时对有大量遗留债务的代码库要保持谨慎。您可以运行带dry-run选项的命令,该命令仅找到并显示问题,而不是立即应用更改。最好的做法是在向旧代码库添加规则时一次尝试一个规则,审查更改,然后继续。某些规则可能会有不良影响,例如升级json_encode和json_decode以抛出异常的规则。
我个人的感觉是,Rector是一个PHP开发者在未来应该习惯使用的工具。它可以使开发人员在使用PHP中的过时运算符和函数以及使升级需要额外关注的代码库变得更加容易之间做出区别。
最后一件事…
如果您到现在还没有注意到,这些PHP工具实际上有一个共同点,那就是这4个高效率的Laravel开发者工具中有3个是由知名的开发者Nuno Maduro制作的。
我知道他通过GitHub接受赞助,请请考虑进行一次性捐赠。同样考虑查看PHPStan、PHP CS Fixer和Rector的开发者,他们使这些出色的工具成为可能。
感谢您阅读!
我是Peter Fox,一位拥有十年PHP和Laravel经验的英国软件开发人员。我已经开始了一个新的项目。Flagfox for Laravel将建立在我已经建立的、帮助开发者为他们的应用程序添加功能标志的开源包的基础上。目前我们有一个等待列表,供感兴趣了解更多信息的开发者使用。
Driesvints 喜欢这篇文章