摘要:最近发现自己写的代码运行结果总跟自己预想的不一样,排查时发现大多是语法错误,在运行之前错误已经种下。最后代码的语法错误,应该在编写的时候及时发现,尽量减少正式运行时错误。
最近发现自己写的PHP代码运行结果总跟自己预想的不一样,排查时发现大多是语法错误,在运行之前错误已经种下。可能是自己粗心大意,或者说php -l检测太简单,不过的确是有一些语法错误埋藏得太深(毕竟PHP是动态语言),那么有没有办法,在代码代码正式运行之前,把语法错误全找出来呢?
这里介绍一款PHP代码静态分析工具:PHPStan,不需要运行代码,也可以对代码进行严格的语法检测,尽量将代码运行错误率降到最低。
PHPStan 安装目前,PHPStanV0.10.2要求系统环境的PHP版本不低于7.1。用Composer全局安装:
$ composer global require phpstan/phpstan使用
PHPStan静态分析的使用方法十分简单:
$ phpstan analyse [-c|--configuration CONFIGURATION] [-l|--level LEVEL] [--no-progress] [--debug] [-a|--autoload-file AUTOLOAD-FILE] [--errorFormat ERRORFORMAT] [--memory-limit MEMORY-LIMIT] [--] []...
configuration:运行配置文件的路径;
level:严格级别,0-7,越大越严格;
no-progress:不显示进度;
debug:debug模式;
autoload-file:自动加载文件的路径;
errorFormat:错误格式;
memory-limit:内存限制;
paths:待分析的文件路径。
比如,分析一个PHP文件:
$ phpstan analyse --level=7 --autoload-file=/PATH/TO/vendor/autoload.php /PATH/TO/someone.phpPHPStan in VSCode
当然,语法分析应该是编辑器做的事,写完代码还要切换到命令终端执行phpstan,未免过于繁琐。所以这里推荐一款VSCode扩展:PHP Static Analysis。
首先,用Composer全局安装PHPStan;然后,在VSCode的扩展管理中搜索PHP Static Analysis,安装第一个匹配的扩展;重载VSCode重载窗口后,扩展会自动分析VSCode下打开的PHP文件。
运行效果:
比如,声明了一个变量未调用,调用了一个未声明的变量和调用了一个未定义的方法等等这样错误都会被检测出了。
不过,宽松一点地来说,其实$this->array()方法是存在的,只是通过魔术方法__call()实现的。
PHPStan with Laravel高严格级别的PHPStan检测到调用未声明的类方法时,会报告类中方法不存在的错误,即使这个类定义了__call()或__callStatic()。
很多应用框架为了优雅,大量使用了魔术方法,比如Laravel。
用PHPStan检测Laravel项目,自然会报告很多调用未声明类方法的错误,对于这个问题,可以借助laravel-ide-helper来降低误报。
$ cd /PATH/TO/LARAVEL_PROJECT $ composer require barryvdh/laravel-ide-helper注入LaravelIdeHelper
编辑app/Providers/AppServiceProvider.php里的注册方法:
app->environment() !== "production") { $this->app->register(BarryvdhLaravelIdeHelperIdeHelperServiceProvider::class); } // ... }生成_ide_helper.php
$ cd /PATH/TO/LARAVEL_PROJECT $ php artisan ide-helper:generate
这时,Laravel框架中的Facade类,原本通过__callStatic()获取的静态方法,全部在_ide_helper.php声明了,在PHPStan检测Laravel项目代码时引入_ide_helper.php文件,就可以减少误报。
PHPStan配置在Laravel项目的根目录下,新建phpstan.neon文件:
parameters: autoload_files: - %currentWorkingDirectory%/_ide_helper.php
在Laravel项目的根目录下,执行phpstan命令时,会自动使用phpstan.neon这个配置。
最后代码的语法错误,应该在编写的时候及时发现,尽量减少正式运行时错误。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/29205.html
摘要:为那些经常出现在控制器或者门脸中的转发代码编写单元测试是很不划算的事。单元测试也有其成本。最理想的做法就是在持续集成服务器上,每次更改时都运行,从而在无需单元测试的情况下防止此类错误的产生。在年开始广泛使用包管理,单元测试和编码标准的工具。 showImg(https://segmentfault.com/img/remote/1460000017004148); PHPStan:无需...
摘要:默认的配置不会检测任何代码。参数列表质量检测包其他有人问,你为什么要这么折磨自己呢其实像类型代码质量工具,不是仅仅自己拿来玩的,在开发人员略多的技术团队,可以通过使用它来达到代码规范一致,如果每个人代码都不一样,后果不堪设想。 showImg(https://segmentfault.com/img/bVbtfeF?w=1796&h=724); 前言 我一生的文章都会放在这里,我的博客...
摘要:比如上面的例子文件文件我们利用做了语法解析检测,代码如下报错哪里类重复了不存在查看该属性是否存在于父类中原理能就是对解析出来的继续做分析,但是前人栽树后人乘凉,这样的完整工具已经有大神帮我们做好了。 原文:我的个人博客 https://mengkang.net/1356.html 工作了两三年,技术停滞不前,迷茫没有方向,不如看下我的直播 PHP 进阶之路 (金三银四跳槽必考,一般人...
摘要:建模语言建模语言是可用于表达信息或知识或系统的任何人造语言,该结构由一组一致的规则定义,目标是可视化,推理,验证和传达系统设计。将这些文件安排到不同的地方称为源代码树。源代码树的结构通常反映了软件的体系结构。 大纲 软件构建的一般过程: 编程/重构 审查和静态代码分析 调试(倾倒和记录)和测试 动态代码分析/分析 软件构建的狭义过程(Build): 构建系统:组件和过程 构建变体...
摘要:是一个免费和开源的应用,能够集成至任何项目中,并收集和展示分析数据。它有没有任何依赖,支持请求,包括常用开发库的通用数据采集器和收集器。 DebugBar 是一个免费和开源的应用,能够集成至任何PHP项目中,并收集和展示分析数据。它有没有任何依赖,支持Ajax请求,包括常用开发库的通用数据采集器和收集器。 相信用过Laravel的调试工具的同学,都感到这个工具非常强大好用,极大地提高了...
阅读 3158·2021-11-08 13:18
阅读 1339·2021-10-09 09:57
阅读 1159·2021-09-22 15:33
阅读 3894·2021-08-17 10:12
阅读 4996·2021-08-16 11:02
阅读 2657·2019-08-30 10:56
阅读 950·2019-08-29 18:31
阅读 3228·2019-08-29 16:30