最近发现本身写的PHP代码运行结果总跟本身预想的不同,排查时发现大可能是语法错误,在运行以前错误已经种下。多是本身粗枝大叶,或者说
php -l
检测太简单,不过的确是有一些语法错误埋藏得太深(毕竟PHP是动态语言),那么有没有办法,在代码代码正式运行以前,把语法错误全找出来呢?
这里介绍一款PHP代码静态分析工具:PHPStan,不须要运行代码,也能够对代码进行严格的语法检测,尽可能将代码运行错误率降到最低。php
目前,PHPStanV0.10.2
要求系统环境的PHP版本不低于7.1。用Composer全局安装:laravel
$ composer global require phpstan/phpstan
PHPStan静态分析的使用方法十分简单:git
$ phpstan analyse [-c|--configuration CONFIGURATION] [-l|--level LEVEL] [--no-progress] [--debug] [-a|--autoload-file AUTOLOAD-FILE] [--errorFormat ERRORFORMAT] [--memory-limit MEMORY-LIMIT] [--] [<paths>]...
好比,分析一个PHP文件:github
$ phpstan analyse --level=7 --autoload-file=/PATH/TO/vendor/autoload.php /PATH/TO/someone.php
固然,语法分析应该是编辑器作的事,写完代码还要切换到命令终端执行phpstan
,未免过于繁琐。因此这里推荐一款VSCode扩展:PHP Static Analysis。bash
首先,用Composer全局安装PHPStan;而后,在VSCode的扩展管理中搜索PHP Static Analysis
,安装第一个匹配的扩展;重载VSCode重载窗口后,扩展会自动分析VSCode下打开的PHP文件。app
运行效果:composer
好比,声明了一个变量未调用,调用了一个未声明的变量和调用了一个未定义的方法等等这样错误都会被检测出了。框架
不过,宽松一点地来讲,其实$this->array()
方法是存在的,只是经过魔术方法__call()
实现的。编辑器
高严格级别的PHPStan检测到调用未声明的类方法时,会报告类中方法不存在的错误,即便这个类定义了__call()
或__callStatic()
。ide
不少应用框架为了优雅,大量使用了魔术方法,好比Laravel。
用PHPStan检测Laravel项目,天然会报告不少调用未声明类方法的错误,对于这个问题,能够借助laravel-ide-helper来下降误报。
$ cd /PATH/TO/LARAVEL_PROJECT $ composer require barryvdh/laravel-ide-helper
编辑app/Providers/AppServiceProvider.php
里的注册方法:
<?php ... public function register() { if ($this->app->environment() !== 'production') { $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class); } // ... }
$ cd /PATH/TO/LARAVEL_PROJECT $ php artisan ide-helper:generate
这时,Laravel框架中的Facade类,本来经过__callStatic()
获取的静态方法,所有在_ide_helper.php声明了,在PHPStan检测Laravel项目代码时引入_ide_helper.php
文件,就能够减小误报。
在Laravel项目的根目录下,新建phpstan.neon
文件:
parameters: autoload_files: - %currentWorkingDirectory%/_ide_helper.php
在Laravel项目的根目录下,执行phpstan
命令时,会自动使用phpstan.neon
这个配置。
代码的语法错误,应该在编写的时候及时发现,尽可能减小正式运行时错误。