摘要:最近發現自己寫的代碼運行結果總跟自己預想的不一樣,排查時發現大多是語法錯誤,在運行之前錯誤已經種下。最后代碼的語法錯誤,應該在編寫的時候及時發現,盡量減少正式運行時錯誤。
最近發現自己寫的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.phpPHPStan 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來降低誤報。
$ 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這個配置。
最后代碼的語法錯誤,應該在編寫的時候及時發現,盡量減少正式運行時錯誤。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29205.html
摘要:為那些經常出現在控制器或者門臉中的轉發代碼編寫單元測試是很不劃算的事。單元測試也有其成本。最理想的做法就是在持續集成服務器上,每次更改時都運行,從而在無需單元測試的情況下防止此類錯誤的產生。在年開始廣泛使用包管理,單元測試和編碼標準的工具。 showImg(https://segmentfault.com/img/remote/1460000017004148); PHPStan:無需...
摘要:默認的配置不會檢測任何代碼。參數列表質量檢測包其他有人問,你為什么要這么折磨自己呢其實像類型代碼質量工具,不是僅僅自己拿來玩的,在開發人員略多的技術團隊,可以通過使用它來達到代碼規范一致,如果每個人代碼都不一樣,后果不堪設想。 showImg(https://segmentfault.com/img/bVbtfeF?w=1796&h=724); 前言 我一生的文章都會放在這里,我的博客...
摘要:比如上面的例子文件文件我們利用做了語法解析檢測,代碼如下報錯哪里類重復了不存在查看該屬性是否存在于父類中原理能就是對解析出來的繼續做分析,但是前人栽樹后人乘涼,這樣的完整工具已經有大神幫我們做好了。 原文:我的個人博客 https://mengkang.net/1356.html 工作了兩三年,技術停滯不前,迷茫沒有方向,不如看下我的直播 PHP 進階之路 (金三銀四跳槽必考,一般人...
摘要:建模語言建模語言是可用于表達信息或知識或系統的任何人造語言,該結構由一組一致的規則定義,目標是可視化,推理,驗證和傳達系統設計。將這些文件安排到不同的地方稱為源代碼樹。源代碼樹的結構通常反映了軟件的體系結構。 大綱 軟件構建的一般過程: 編程/重構 審查和靜態代碼分析 調試(傾倒和記錄)和測試 動態代碼分析/分析 軟件構建的狹義過程(Build): 構建系統:組件和過程 構建變體...
摘要:是一個免費和開源的應用,能夠集成至任何項目中,并收集和展示分析數據。它有沒有任何依賴,支持請求,包括常用開發庫的通用數據采集器和收集器。 DebugBar 是一個免費和開源的應用,能夠集成至任何PHP項目中,并收集和展示分析數據。它有沒有任何依賴,支持Ajax請求,包括常用開發庫的通用數據采集器和收集器。 相信用過Laravel的調試工具的同學,都感到這個工具非常強大好用,極大地提高了...
閱讀 3197·2021-11-08 13:18
閱讀 1353·2021-10-09 09:57
閱讀 1182·2021-09-22 15:33
閱讀 3960·2021-08-17 10:12
閱讀 5053·2021-08-16 11:02
閱讀 2676·2019-08-30 10:56
閱讀 962·2019-08-29 18:31
閱讀 3251·2019-08-29 16:30