PHP代码静态分析工具PHPStan

最近发现自己写的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] [--] [<paths>]...

  • 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里的注册方法:

<?php
    ...
    public function register()
    {
        if ($this->app->environment() !== 'production') {
            $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::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://segmentfault.com/a/1190000015956085

原文地址:https://www.cnblogs.com/lalalagq/p/9975250.html

时间: 2024-08-29 05:08:45

PHP代码静态分析工具PHPStan的相关文章

代码静态分析工具PC-LINT安装配置

代码静态分析工具PC-LINT安装配置--step by step                             作者:ehui928                             2006-5-20 PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器.它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误. C语言的灵活性带来了代码效率的提升,但相应带来了代码编写的随意性,另外C编译器不进行强制类型检查,也带来

代码静态分析工具

今天在haskell群里请教问题时,某巨说我需要hlint,然而我并不知道hlint是什么鬼. (haskell linter) 也就是haskell的代码静态分析工具.并不会对代码进行编译,只是会给出一些tips.可以帮助代码变得 strong,safe and so on. 然后出于好奇,便找了一个cpplinter, google用python写的一个工具.可以对c++进行静态分析. 这边有篇不错的文章可以借鉴.传送门

C++ 代码静态分析工具cppcheck

C++ 代码静态分析工具cppcheck Author:Echo Chen(陈斌) Email:[email protected] Blog:Blog.csdn.net/chen19870707 Date:Jan.1st , 2015 近来游戏进入尾期,已上线运营,需求比较少,可以有时间整理优化下代码,但是优化如果没有一个标准,很难有一个实际的效果,所以先从简单的代码静态分析开始,找了许多代码静态检查的工具,splint,pclint.purify,infusion.cppcheck等,但cpp

C++代码静态分析工具splint

1.引言 最近在项目中使用了静态程序分析工具PC-Lint, 体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.windows平台的静态分析工具,FlexeLint是针对其他平 台的PC-Lint版本.由于PC-Lint/FlexeLint是商业的程序分析工具,不便于大家对其进行学习和使用,因而下面我将介绍一个针对C语言 的开源程序静态分析工具——splint. 2.静态程序分析 先来说说什么是“静态程序分析(Static program analysis)”,静态

代码静态分析工具--PMD,Findbugs,CheckStyle

最近学习Mybatis的官方文档,看到了[项目文档]一节有很多内容没有见过,做个笔记,理解一下. PMD 扫描Java源代码,查找潜在的问题,如: 可能的bugs,如空的try/catch/finally/switch声明 死亡的代码,没有使用的本地变量,参数和私有方法 不合标准的代码,如String/StringBuffer用法 过于复杂的表达式,如不必要的if表达式 重复的代码,拷贝.粘贴的代码 FindBugs 它用来查找Java代码中存在的bug.它使用静态分析方法标识出Java程序中上

代码静态分析工具的误报原因分析

1. 引言 本篇文章分析了代码静态分析的基本原理以产生误报的根本原因,并介绍了形式化方法在LDRA工具套件中的应用情况.文章从实际工程应用的角度阐述了这些形式化方法的局限性,在参考文献1<Formal Methods Implemented in the LDRA Tool Suite>中我们详细描述了形式化方法是如何在LDRA工具套件中被实现的,了解到实现这些形式化方法的算法都被内化在了LDRA工具套件的静态分析组件之中,使用工具的用户不需要具备这方面的知识.在工具中所有被分析的源代码文件,

PhpStorm添加PHP代码规范检查CodeSniffer(phpcs)和PHP代码静态分析工具Mess Detector(phpmd)

一.安装 添加镜像,加速下载 ./composer.phar  config -g repo.packagist composer https://packagist.phpcomposer.com CodeSniffer composer.phar global require "squizlabs/php_codesniffer=*" Mess Detector composer.phar global require "phpmd/phpmd=*" 二.Php

常用 Java 静态代码分析工具的分析与比较

转载自: http://www.oschina.net/question/129540_23043 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中. 引言 在 Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代

【转载】常用 Java 静态代码分析工具的分析与比较

摘自:http://www.oschina.net/question/129540_23043常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中. 引言 在 Java 软件开发过程中,开发团