PHP語法錯誤埋藏得太深怎么辦?(圖)
2021-07-24
最近發(fā)現(xiàn)自己寫的PHP代碼運行結(jié)果總是和預(yù)想的不一樣。在排查過程中,我發(fā)現(xiàn)大部分都是語法錯誤,而且這些錯誤在運行之前就已經(jīng)被種下了??赡苁悄愦中牧?,也可能是php -l檢測太簡單了,但是確實有些語法錯誤埋得太深了(畢竟PHP是動態(tài)語言)php 框架源碼分析,那么有沒有辦法消除所有的語法錯誤代碼正式運行前的錯誤找出來?
這里介紹一個PHP代碼靜態(tài)分析工具:不需要運行代碼,也可以對代碼進行嚴格的語法檢查,盡量減少代碼的錯誤率。
安裝
目前.10.2要求系統(tǒng)環(huán)境PHP版本不低于7.1。全局安裝:
$ composer global require phpstan/phpstan
使用
靜態(tài)分析的使用很簡單:
$ phpstan analyse [-c|--configuration CONFIGURATION] [-l|--level LEVEL] [--no-progress] [--debug] [-a|--autoload-file AUTOLOAD-FILE] [--errorFormat ERRORFORMAT] [--memory-limit MEMORY-LIMIT] [--] []...
例如,分析一個 PHP 文件:
$ phpstan analyse --level=7 --autoload-file=/PATH/TO/vendor/autoload.php /PATH/TO/someone.php
在
當然,語法分析應(yīng)該由編輯來完成。寫完代碼還得切換到命令終端執(zhí)行,太麻煩了。所以這里推薦一個擴展:PHP。
首先使用全局安裝;然后,在擴展管理中搜索PHP并安裝第一個匹配的擴展;重新加載重新加載窗口后,擴展程序會自動分析打開的 PHP 文件。
操作效果:
例如,如果一個變量被聲明但沒有被調(diào)用,一個未聲明的變量被調(diào)用,一個未定義的方法被調(diào)用等等,都會檢測到錯誤。
不過,松散地說,$this->()方法其實是存在的,而且只是通過魔術(shù)方法()來實現(xiàn)。
與
high- 級別檢測到調(diào)用了未聲明的類方法時,會報錯該方法在類中不存在,即使類定義了()或()。
為了優(yōu)雅,很多應(yīng)用框架使用了很多神奇的方法,比如。
使用檢測項,調(diào)用未聲明類的方法時自然會報很多錯誤。對于這個問題,可以使用-ide-來減少誤報。
安裝-ide-
$ cd /PATH/TO/LARAVEL_PROJECT
$ composer require barryvdh/laravel-ide-helper
注射
編輯app//.php中的注冊方法:
app->environment() !== 'production') {
$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
}
// ...
}
生成.php
$ cd /PATH/TO/LARAVEL_PROJECT
$ php artisan ide-helper:generate
此時框架中的類,原來通過()獲取的靜態(tài)方法,都在.php中聲明。檢查項目代碼時引入.php文件可以減少誤報。
配置
在項目根目錄下新建一個.neon文件:
parameters:
autoload_files:
- %currentWorkingDirectory%/_ide_helper.php
在項目根目錄下,執(zhí)行命令時會自動使用.neon配置。
終于
在編寫時應(yīng)及時發(fā)現(xiàn)代碼中的語法錯誤php 框架源碼分析,以盡量減少正式運行時的錯誤。