PHPStan:无需编写测试即可查找代码中的错误每当我看到开发人员从Java或C#等编译型语言切换到PHP等解释型语言时,我很高兴能够提高工作效率。除了这些常规的执行模型(发起、处理请求和结束请求)和更短的反馈循环(无需等待编译器)之外,还有一个开源框架的生态系统可以解决开发人员的日常问题,因此PHP目前Speak是Web开发中最流行的语言。但它有一个缺点。你什么时候会发现错误?在程序运行之前,编译型语言需要知道每个变量的类型、每个方法的返回类型。这就是为什么编译器需要确保程序没有错误,并且会在源代码中向您指出这些类型的错误,例如调用未定义的方法或将错误数量的参数传递给函数。编译器是将应用程序部署到生产环境之前的第一道防线。但是,PHP不是这种情况。如果程序出错,执行错误的代码就会崩溃。在测试PHP应用程序时,无论是自动化测试还是手动测试,开发人员都会花费大量时间检查其他编译语言不会犯的错误,从而减少测试实际业务逻辑所花费的时间。我想改变这个。欢迎来到PHPStan的世界PHP实践的当前阶段产生代码库,我们可以在其中键入大部分数据并转换为静态类型语言,同时保留一些动态语言功能。人们正在使当前的PHP代码库变得与任何其他语言一样有趣。面向对象、依赖注入和设计模式的使用变得非常普遍。这让我想到了PHP的静态分析工具,它将取代其他语言的编译器作用。我花了很多时间研究它,并使用它的各种开发版本来检查我们的代码库一年多了。它是PHPStan,开源且免费它目前验证了什么?关于类、对象实例、错误/异常捕获、类型约束和其他语言结构的存在。PHP仍然不检查这些,但会显示其中未使用的代码。被调用方法和函数的存在性和可访问性。还要检查他们的参数数量。该方法是否返回其声明的返回类型。访问的成员变量的存在性和可见性。它还可以指示是否已将另一种类型的值分配给给定类型的成员变量。sprintf/printf函数基于格式字符串应接收的参数数量。分支和循环作用域中存在变量。无用的表格规范。例如(string)'foo',以及不同类型变量(===和!==)之间的严格比较,因为它们总是求值为false。此列表的内容随着每个版本的增加而增加。但是PHPStan的成就不会只靠这个小技巧。PHPStan运行速度非常快……它设法一次性检查整个代码库。它消除了多次检查代码的需要。只需浏览到您要分析的代码,例如你写的代码。它消除了解析和分析第三方依赖项的需要。相反,它使用反射来查找有关您的代码库中引用的其他人代码的有用信息。PHPStan可以在一分钟内检查我们的代码库(6000个文件,600kLOC)。一秒内完成自检。...可扩展性即使当前使用静态类型,开发人员也可以合法地使用PHP的动态语法特性,例如get、set和__call魔术方法。他们可以在运行时定义新的属性和方法。通常,静态分析会将属性和方法视为未定义,但有一种机制告诉引擎如何创建新的属性和方法。它受益于允许用户扩展的本机PHP反射的自定义抽象。可以在README中的类反射扩展章节中找到更多详细信息。一些方法返回的类型取决于它的参数。它可以依赖于你传递给它的类名,它可能会返回一个与传递的对象属于同一类的对象。这就是动态返回类型扩展的用途。压轴:如果你想出一个新的PHPStan检查,你可以自己动手。可以提出特定于框架的规则,例如检查DQL查询中引用的实体和字段是否存在,或者在您选择的MVC框架中生成的链接是否与现有控制器相关。选择规范级别我使用过其他工具并将它们集成到现有代码库中,但这是一次糟糕的体验。他们抛出数以千计的错误阻止你使用它。相反,我回顾了如何将PHPStan集成到刚刚进入开发阶段的代码库中。第一个版本不是很强大,此时发现的bug也不多。但是从集成的角度来说,还是很不错的---我有时间就给它加新的规则,我修复它在版本库中发现的bug,然后把新的代码合并到master分支。我们将使用新版本几周来发现它发现的错误,并一遍又一遍地迭代。这种循序渐进的规范方法在实践中似乎是有益的,所以我使用PHPStan的现有功能对其进行了模拟。默认情况下,PHPStan只检查它确定的代码——常量、实例化、调用$this的方法、静态调用的方法、函数和各种语言结构中的现有类。通过增加级别(从默认值0到当前值4),您还增加了它对代码所做的假设数量和它检查的规则数量。如果内置关卡无法满足您的要求,您还可以自定义规则。少写单元测试!(从沙子中选择金子)也许你从来没有听说过这个忠告。即使对于非常小的代码段,开发人员也必须编写单元测试,因为犯错的机会均等,例如简单的拼写错误或忘记将结果分配给变量。为经常出现在控制器或门面中的转发代码编写单元测试并不划算。单元测试也有其成本。它们也是代码,无法摆脱编写和维护它们的常规。理想情况下,在持续集成服务器上,在每次更改时运行PHPStan,以防止在没有单元测试的情况下出现此类错误。实现100%的代码覆盖率真的很难而且非常昂贵,但您可以静态分析100%的代码。至于单元测试的重点,应该集中在静态分析代码难以检测和容易出错的地方。包括:复杂的数据过滤、循环、条件判断、乘法和除法包括舍入计算等。如果不是NikitaPopov创造了PHPParser,站在巨人的肩膀上。不会有PHPStan。PHP在2016年开始广泛使用包管理、单元测试和编码标准等工具。然而,直到现在还没有一种广泛使用的工具可以在不运行代码的情况下检查代码是否有错误。因此,我创建了一个易于使用、快速、可扩展的版本,它对您的代码没有严格的要求,您仍然可以从这些检查中受益。查看GitHub存储库以了解如何将其集成到您的项目中!更多文章:https://laravel-china.org/c/t...
