优秀PHP工程师必备,PHPStan,PHP 静态代码错误检查工具
qiyuwang 2024-10-25 16:40 68 浏览 0 评论
PHPStan:无需写测试就能找到代码中的 Bug
每当我看到开发人员从 Java 或 C# 等编译语言切换到 PHP 这样的解释语言时解放了生产力后感到很高兴。除了这些常规的执行模型(发起、处理请求和结束请求)和更短的反馈环(无需等待编译器)外,还有一个能解决开发人员日常问题的开源框架生态系统,因此,PHP 是目前来说 web 开发中最流行的语言。
但它有一个缺点。
你会在什么时候发现错误?
编译型语言需要在程序运行之前了解每个变量的类型,每个方法的返回类型。这就是为什么编译器需要确保程序是没有错误的,并且会在源码中向你指出这些类型的错误,比如调用了未定义的方法或者是向某个函数传递了错误数量的参数。在把应用程序部署到生产环境前,编译器算是第一道防线。
然而 PHP 就不会这样了。如果程序出错,会执行到错误的代码的时候崩溃。在测试 PHP 应用时,不管是自动化测试还是手动测试,开发人员都会花费大量时间去查一些其它编译型语言不会犯的错从而减少测试实际业务逻辑的时间。
我想改变这一点。
欢迎来到 PHPStan 的世界
现阶段 PHP 实践所产生的代码库中,我们可以确定大部分数据的类型,并且转换为静态类型的语言,尽管还保留着一些动态语言的特性。人们把现在的 PHP 代码库变得跟其他语言一样更加有趣。面向对象,依赖注入以及设计模式的使用已经变得非常普遍。
这让我想到了 PHP 的 静态分析工具,它将替代其他语言的编译器角色。我花了很多时间研究它,并且已经使用它的各种开发版本来检查我们的代码库超过一年。
它就是 PHPStan, 开源且免费
它目前校验什么?
- 有关类中涉及的,对象实例, 错误 / 异常捕获,类型约束以及其他语言结构的存在性。 PHP 照旧不会检查这些, 但是会展现其中未被使用的代码。
- 被调用的方法和函数的存在性和可访问性。同样也会检查他们的参数个数。
- 方法是否返回了它声明的返回值类型。
- 被访问成员变量的存在性和可见性。它也可指出是否将一个其他的类型的值赋给了既定类型的成员变量。
- sprintf/printf 函数基于格式化字符串所应接收的参数个数。
- 分支和循环范围中的变量的存在性。
- 无用的形式指定。例如 (string) 'foo' ,以及不同类型变量间的严格比较 (=== 和 !==),因为他们的结果总为 false。
这个清单的内容随着每次发布都在递增。但成就 PHPStan 也不会只仰赖此一技之微。
PHPStan 迅疾如飞...
它设法一次性检查整个代码库。 它无需多次遍历代码。 只需浏览您想要分析的代码,例如 你写的代码。它无需解析和分析第三方依赖项。 相反,它使用反射来找出有关你代码库中引用的他人代码的有用信息。
PHPStan 能在一分钟里检查我们的代码库 (6000 个文件, 600k LOCs) 。它可在一秒内完成自查。
... 可扩展性
即便当前正在使用静态类型,开发者也可以合法的使用 PHP 的动态语法特性,例如 get, set 和 __call 这些魔术方法。它们可以在运行时去定义新属性和方法。通常,静态分析都会爆出属性和方法未定义,但是有一种机制可以告诉引擎如何创建新的属性和方法。
它得益于对允许用户扩展的原生 PHP 反射的自定义抽象。更多细节可查看 README 中类反射扩展章节。
某些方法返回的类型取决于它的参数。它可以取决于你传递给它的类名,也可能返回与传递的对象相同的类的对象。这就是 动态返回类型扩展 的用途。
压轴语: 如果你想自己出一个 PHPStan 的新的检查项, 你可以自力更生。可以提出基于特定框架的规则,例如检查 DQL 查询中引用的实体和字段是否存在,或者你选择的 MVC 框架中生成的链接是否和现存的控制器有关。
选择规范级别
我使用过其他工具,并将之集成进现有的代码库中,这种体验真是往事不堪回首。他们爆出成千上万的错误让你没法使用。
取而代之,我回顾如何集成 PHPStan 到刚进入开发阶段的代码库中。 首个版本的功能不是很强大,这时并未发现多少错误。但从集成的角度来看,它还是非常不错的?---?有空时,我就为它增加新规则,我修复了它在版本库中找到的错误,并将新代码合并到主分支。我们会使用新版本几周用来发现其找到的错误,并不断重复这件事。这种逐级增加的规范性的做法在实践中看来大有裨益,所以我使用 PHPStan 的现有功能来模拟它。
默认情况下,PHPStan 只检查它确定的代码 --- 常量,实例化,调用 $ this 的方法,静态调用的方法,函数和各种语言结构中的现有类。 通过增加级别(从默认值 0 到当前值 4),您还可以增加它对代码所做的假设数量以及它检查的规则数量。
如果内建级别无法满足你的要求,你同样也可以自定义规则。
少写单元测试!(披沙拣金)
可能这个建议你闻所未闻。即便是非常细碎的代码,开发者也不得不编写单元测试,因为这方面犯错的几率都是均等的,例如简单的拼写错误或者忘记将结果赋值给变量。为那些经常出现在控制器或者门脸中的转发代码编写单元测试是很不划算的事。
单元测试也有其成本。它们同样也是代码,难逃编写和维护的窠臼。最理想的做法就是在持续集成服务器上,每次更改时都运行 PHPStan,从而在无需单元测试的情况下防止此类错误的产生。实现 100%的代码覆盖率真的很难,并且非常昂贵,但你可以静态分析 100%的代码。
至于单元测试的重点应当集中在静态分析代码难以察觉的,容易出错的地方。包括:复杂的数据过滤,循环,条件判断,乘除法包含舍入的计算等。
站在巨人的肩膀上
如果不是 Nikita Popov 创建了 PHP Parser。就不会有 PHPStan 的出现。
PHP 在 2016 年开始广泛使用 包管理, 单元测试 和 编码标准 的工具。然而到现在也没有一个广泛使用的工具,可以在不运行代码的情况下检查代码中的错误。所以我创建了一个易于使用,快速,可扩展的版本,既不会对您的代码有严格的要求,你还会从这些检查中受益。查看 GitHub 仓库 ,了解如何将其集成到您的项目中!
原文地址:https://medium.com/@ondrejmirtes/phpstan-2939cd0ad0e3
译文地址:https://learnku.com/laravel/t/19011
相关推荐
- 微软宣布将于10月份关闭OneDrive组功能
-
【巴士数码】微软已经宣布将在今年10月关闭OneDrive的组功能。一年多之前,微软已经关闭了用户在OneDrive当中创建组的功能。大大多数用户会发现共享文件夹是一种合适的替代品,而且由于这一点,O...
- 玩转Win10任务栏:从基础设置到效率神器的全攻略
-
一、基础操作:解锁任务栏的「隐藏布局」...
- 文档以只读模式打开的原因及解决方法
-
当文档以只读模式打开时,可能由多种原因导致。以下是详细的原因分析与对应解决方法,您可根据实际情况灵活选择操作。一、文件属性设置问题(一)Windows系统在Windows系统中,若文件属性被标记...
- Windows系统的优化(windows优化设置)
-
今天给大家讲一讲系统的图标和一些基本的优化。安装了原版系统之后有很多地方需要优化比如桌面图标小箭头,盾牌,休眠占用内存,关闭通知栏。首先我们打开软件这款软件以前就讲到过就是dism++软件,他可以清理...
- Win 10偷偷传送用户隐私至微软(win10设备隐私)
-
自推出以来Win10不断被揭发盗取用户带宽、泄漏WiFi密码等各式各样的私隐问题,令不少网络专家开始留意Win10还隐藏了多少类似的私隐漏洞。最近再有人发现Win10部分功能静静...
- OneDrive逆势下调存储空间,不限量存储被取消
-
日前,微软在周一晚发布的博客文章中表示,由于部分用户存滥用储存功能,所以该公司将取消不限量OneDrive存储服务。不限量用户的最大存储空间将被下调至1TB,定价为6.99美元,对于已存储较多文件和内...
- Win10中那些被微软取消的功能(微软公司从9日起停止对windows8的主流服务支持)
-
很多用户在使用Win10的时候,都会发现一些在Win7系统中的功能被取消了,有的时候想找也找不到。那么到底是那些过去的功能在Win10中被取消了呢?下面我们就简单梳理一下,并且告诉大家解决的办法。Wi...
- 微软推Win11 Dev 26200.5570预览版:语音打字上线脏话过滤选项
-
IT之家4月26日消息,微软公司昨日(4月25日)发布博文,邀请Dev频道的WindowsInsider项目成员,测试适用于Windows1124H2的KB50556...
- 微软VSCode商店发现9款挖矿恶意插件,已安装超30万次
-
IT之家4月8日消息,科技媒体bleepingcomputer昨日(4月7日)发布博文,报道称安全专家在微软VSCode扩展商店中,发现了9款伪装成开发工具的恶意插件。这些插...
- 微软Windows 11开始菜单大改版!(windows 11 开始菜单)
-
根据最新消息,微软正在对Windows11的开始菜单进行重大改版,这一更新将彻底改变其布局和功能。Windows11的开始菜单将从现有的多栏布局改为单栏可滚动视图,所有固定图标和已安装应用都将集中...
- OneDrive无限存储空间取消 免费降至5GB
-
2015-11-0313:35:06作者:徐鹏北京时间11月3日消息,微软在一篇博客文章中称,将取消OneDrive存储服务的不限量空间,原因是部分用户有滥用问题。OneDrive无限存储空间取消...
- 省出电脑C盘空间!微软悄悄更新:OneDrive终于能卸载了
-
快科技3月12日消息,近日,微软悄悄地在官方更新了关闭、禁用、卸载Windows自带软件OneDrive的方法。微软Windows系统自带了很多软件和功能,其中有很多我们可能永远都用不上。但这些软件还...
- 微软关闭OneDrive新建组群功能(windows关闭onedrive)
-
微软的OneDrive云端储存服务能够让你创建组群(Group),这样当你和团队成员共同从事一个项目的时候能够通过云端协作提升效率,并且组群的文档储存空间还将同你标准的OneDrive分割独立开来。不...
- 微软为何取消OneDrive无限制容量存储?被75TB占用吓坏
-
那么为什么微软会取消Office365的无限OneDrive存储呢?“自推出Office365订阅无限制存储服务以来,一小部分用户开始备份多台PC设备,存储众多电影收藏合集和DVR录像。在某些情况下...
- Win11必关的5个设置!关闭后电脑流畅到起飞,操作简单不藏私!
-
Windows11虽然界面炫酷,但默认设置中隐藏了不少“拖慢电脑”的坑!尤其是老电脑用户,用久了卡顿、开机慢、反应迟钝……其实只需关闭几个鸡肋功能,就能让电脑提速50%以上!...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 微软宣布将于10月份关闭OneDrive组功能
- 玩转Win10任务栏:从基础设置到效率神器的全攻略
- 文档以只读模式打开的原因及解决方法
- Windows系统的优化(windows优化设置)
- Win 10偷偷传送用户隐私至微软(win10设备隐私)
- OneDrive逆势下调存储空间,不限量存储被取消
- Win10中那些被微软取消的功能(微软公司从9日起停止对windows8的主流服务支持)
- 微软推Win11 Dev 26200.5570预览版:语音打字上线脏话过滤选项
- 微软VSCode商店发现9款挖矿恶意插件,已安装超30万次
- 微软Windows 11开始菜单大改版!(windows 11 开始菜单)
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)