最近发现自己写的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这个配置。

最后

代码的语法错误,应该在编写的时候及时发现,尽量减少正式运行时错误。

PHP代码静态分析工具PHPStan相关推荐

  1. Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy

    Linux平台下QtCreator集成代码静态分析工具clang-tidy和Clazy 原文连接: https://blog.csdn.net/wsj18808050/article/details/ ...

  2. C/C++代码静态分析工具调研

    简述 静态分析(static analysis)是指在不执行代码的情况下对其进行分析评估的过程,是软件质量和软件安全保障的重要一环.它通过词法分析.语义分析.控制流分析.数据流分析等技术对代码逐行解析 ...

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

    PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器.它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误.  C语言的灵活性带来了代码 ...

  4. 代码静态分析工具-splint的学习与使用[转]

    代码静态分析工具--splint的学习与使用[转] 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.window ...

  5. linux pclint配置_代码静态分析工具PC-LINT安装配置

    PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器.它不仅可以检查出一般的语法错误,还可以检查出那些虽然符合语法要求但不易发现的潜在错误. C语言的灵活性带来了代码效 ...

  6. 代码静态分析工具——splint的学习与使用

    引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便.PC-Lint是一款针对C/C++语言.windows平台的静态分析工具,FlexeLint是针对其他平 ...

  7. php代码静态分析工具,Wpbullet:一款针对WordPress(PHP)的静态代码分析工具

    今天给大家介绍的是一款名叫Wpbullet的工具,广大安全研究人员可以使用这款工具来对WordPress.插件.主题以及其他PHP项目进行静态代码分析. 工具安装 大家可以直接从Wpbullet的Gi ...

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

    首先需要了解一下这些工具是用来干什么: PHPCS 是 PHP Code Sniffer,一款代码规范检查工具,可以根据你的设置来检查代码规范性问题. PHPCBF 是PHPCS 内置的代码规范修复工 ...

  9. ABAP代码静态分析工具SQF - Support Query Framework

    如果系统里没有SQF这个tcode,可以参考note 1814328: SQF: Plug-In for Source Code Scans进行安装. ABAP static analysis too ...

最新文章

  1. 腾讯!阿里!大二男生斩获4家头部科技公司实习offer!完整经验总结!
  2. CPU 有个禁区,内核权限也无法进入!
  3. 9path 导致的一场冤假错案
  4. python工程师薪资-Python工程师工资多少
  5. leetcode 477. 汉明距离总和(位运算)
  6. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...
  7. Flutter实战一Flutter聊天应用(六)
  8. 6. laravel 控制器
  9. systemd (简体中文)
  10. java怎么控制页面打印次数_java – 控制打印页面上面板的大小
  11. 电影下载地址大集合,只要是电影就能找到
  12. 解决Iframe嵌入帆软BI系统后,Chrome升级后跨域出现登录界面,Cookie写入不成功。解决办法
  13. C++中string类
  14. 该内存不能为 read/written解决办法
  15. 入门3D游戏建模,是选择角色建模还是场景建模,看完你来选
  16. 用ps魔棒工具选区域和改变区域颜色
  17. mfc 中如果存在sleep延时后按钮无法响应解决方案
  18. live两种读音[liv][laiv]含义上的区别
  19. ARMV8体系结构简介:exclusive操作例子
  20. 冬天户外用嘴呼气冒“白气”,是气化现象

热门文章

  1. Eclipse VIM
  2. 在共享DLL中使用MFC 和在静态库中使用MFC的区别
  3. 超图桌面版开发入门图解
  4. 控制台和Win32 API程序输出变量地址值
  5. 图解Telnet命令和命令行看邮件
  6. 一个批量停止和启动服务的工具
  7. [No000053]我25岁了,是应该继续挣钱,还是选择自己的爱好?--正好庆祝自己25岁生日...
  8. CSS中position的几个属性值
  9. Get Start from today
  10. 数据库LINQ TO SQL在Silverlight中的应用(WCF)------学习笔记(一)