资讯专栏INFORMATION COLUMN

PHP代码静态分析工具PHPStan

邹立鹏 / 1584人阅读

摘要:最近发现自己写的代码运行结果总跟自己预想的不一样,排查时发现大多是语法错误,在运行之前错误已经种下。最后代码的语法错误,应该在编写的时候及时发现,尽量减少正式运行时错误。

最近发现自己写的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.php
PHPStan 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来降低误报。

安装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

相关文章

  • PHP工具箱:PHPStan —— PHP 静态代码分析工具

    摘要:为那些经常出现在控制器或者门脸中的转发代码编写单元测试是很不划算的事。单元测试也有其成本。最理想的做法就是在持续集成服务器上,每次更改时都运行,从而在无需单元测试的情况下防止此类错误的产生。在年开始广泛使用包管理,单元测试和编码标准的工具。 showImg(https://segmentfault.com/img/remote/1460000017004148); PHPStan:无需...

    raledong 评论0 收藏0
  • 使用GrumPHP来纠正代码“毛病”

    摘要:默认的配置不会检测任何代码。参数列表质量检测包其他有人问,你为什么要这么折磨自己呢其实像类型代码质量工具,不是仅仅自己拿来玩的,在开发人员略多的技术团队,可以通过使用它来达到代码规范一致,如果每个人代码都不一样,后果不堪设想。 showImg(https://segmentfault.com/img/bVbtfeF?w=1796&h=724); 前言 我一生的文章都会放在这里,我的博客...

    jubincn 评论0 收藏0
  • 使用 Phan 为你的 PHP 项目保驾护航 - 代码静态扫描

    摘要:比如上面的例子文件文件我们利用做了语法解析检测,代码如下报错哪里类重复了不存在查看该属性是否存在于父类中原理能就是对解析出来的继续做分析,但是前人栽树后人乘凉,这样的完整工具已经有大神帮我们做好了。 原文:我的个人博客 https://mengkang.net/1356.html 工作了两三年,技术停滞不前,迷茫没有方向,不如看下我的直播 PHP 进阶之路 (金三银四跳槽必考,一般人...

    array_huang 评论0 收藏0
  • 第2章:软件构建的过程和工具 2.2软件构建的过程,系统和工具

    摘要:建模语言建模语言是可用于表达信息或知识或系统的任何人造语言,该结构由一组一致的规则定义,目标是可视化,推理,验证和传达系统设计。将这些文件安排到不同的地方称为源代码树。源代码树的结构通常反映了软件的体系结构。 大纲 软件构建的一般过程: 编程/重构 审查和静态代码分析 调试(倾倒和记录)和测试 动态代码分析/分析 软件构建的狭义过程(Build): 构建系统:组件和过程 构建变体...

    godiscoder 评论0 收藏0
  • 利用开源的DebugBar工具调试PHP代码

    摘要:是一个免费和开源的应用,能够集成至任何项目中,并收集和展示分析数据。它有没有任何依赖,支持请求,包括常用开发库的通用数据采集器和收集器。 DebugBar 是一个免费和开源的应用,能够集成至任何PHP项目中,并收集和展示分析数据。它有没有任何依赖,支持Ajax请求,包括常用开发库的通用数据采集器和收集器。 相信用过Laravel的调试工具的同学,都感到这个工具非常强大好用,极大地提高了...

    monw3c 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<