摘要:最近發(fā)現(xiàn)自己寫的代碼運行結(jié)果總跟自己預(yù)想的不一樣,排查時發(fā)現(xiàn)大多是語法錯誤,在運行之前錯誤已經(jīng)種下。最后代碼的語法錯誤,應(yīng)該在編寫的時候及時發(fā)現(xiàn),盡量減少正式運行時錯誤。
最近發(fā)現(xiàn)自己寫的PHP代碼運行結(jié)果總跟自己預(yù)想的不一樣,排查時發(fā)現(xiàn)大多是語法錯誤,在運行之前錯誤已經(jīng)種下。可能是自己粗心大意,或者說php -l檢測太簡單,不過的確是有一些語法錯誤埋藏得太深(畢竟PHP是動態(tài)語言),那么有沒有辦法,在代碼代碼正式運行之前,把語法錯誤全找出來呢?
這里介紹一款PHP代碼靜態(tài)分析工具:PHPStan,不需要運行代碼,也可以對代碼進(jìn)行嚴(yán)格的語法檢測,盡量將代碼運行錯誤率降到最低。
PHPStan 安裝目前,PHPStanV0.10.2要求系統(tǒng)環(huán)境的PHP版本不低于7.1。用Composer全局安裝:
$ composer global require phpstan/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] [--] []...
configuration:運行配置文件的路徑;
level:嚴(yán)格級別,0-7,越大越嚴(yán)格;
no-progress:不顯示進(jìn)度;
debug:debug模式;
autoload-file:自動加載文件的路徑;
errorFormat:錯誤格式;
memory-limit:內(nèi)存限制;
paths:待分析的文件路徑。
比如,分析一個PHP文件:
$ phpstan analyse --level=7 --autoload-file=/PATH/TO/vendor/autoload.php /PATH/TO/someone.phpPHPStan in VSCode
當(dāng)然,語法分析應(yīng)該是編輯器做的事,寫完代碼還要切換到命令終端執(zhí)行phpstan,未免過于繁瑣。所以這里推薦一款VSCode擴(kuò)展:PHP Static Analysis。
首先,用Composer全局安裝PHPStan;然后,在VSCode的擴(kuò)展管理中搜索PHP Static Analysis,安裝第一個匹配的擴(kuò)展;重載VSCode重載窗口后,擴(kuò)展會自動分析VSCode下打開的PHP文件。
運行效果:
比如,聲明了一個變量未調(diào)用,調(diào)用了一個未聲明的變量和調(diào)用了一個未定義的方法等等這樣錯誤都會被檢測出了。
不過,寬松一點地來說,其實$this->array()方法是存在的,只是通過魔術(shù)方法__call()實現(xiàn)的。
PHPStan with Laravel高嚴(yán)格級別的PHPStan檢測到調(diào)用未聲明的類方法時,會報告類中方法不存在的錯誤,即使這個類定義了__call()或__callStatic()。
很多應(yīng)用框架為了優(yōu)雅,大量使用了魔術(shù)方法,比如Laravel。
用PHPStan檢測Laravel項目,自然會報告很多調(diào)用未聲明類方法的錯誤,對于這個問題,可以借助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()獲取的靜態(tài)方法,全部在_ide_helper.php聲明了,在PHPStan檢測Laravel項目代碼時引入_ide_helper.php文件,就可以減少誤報。
PHPStan配置在Laravel項目的根目錄下,新建phpstan.neon文件:
parameters: autoload_files: - %currentWorkingDirectory%/_ide_helper.php
在Laravel項目的根目錄下,執(zhí)行phpstan命令時,會自動使用phpstan.neon這個配置。
最后代碼的語法錯誤,應(yīng)該在編寫的時候及時發(fā)現(xiàn),盡量減少正式運行時錯誤。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29205.html
摘要:為那些經(jīng)常出現(xiàn)在控制器或者門臉中的轉(zhuǎn)發(fā)代碼編寫單元測試是很不劃算的事。單元測試也有其成本。最理想的做法就是在持續(xù)集成服務(wù)器上,每次更改時都運行,從而在無需單元測試的情況下防止此類錯誤的產(chǎn)生。在年開始廣泛使用包管理,單元測試和編碼標(biāo)準(zhǔn)的工具。 showImg(https://segmentfault.com/img/remote/1460000017004148); PHPStan:無需...
摘要:默認(rèn)的配置不會檢測任何代碼。參數(shù)列表質(zhì)量檢測包其他有人問,你為什么要這么折磨自己呢其實像類型代碼質(zhì)量工具,不是僅僅自己拿來玩的,在開發(fā)人員略多的技術(shù)團(tuán)隊,可以通過使用它來達(dá)到代碼規(guī)范一致,如果每個人代碼都不一樣,后果不堪設(shè)想。 showImg(https://segmentfault.com/img/bVbtfeF?w=1796&h=724); 前言 我一生的文章都會放在這里,我的博客...
摘要:比如上面的例子文件文件我們利用做了語法解析檢測,代碼如下報錯哪里類重復(fù)了不存在查看該屬性是否存在于父類中原理能就是對解析出來的繼續(xù)做分析,但是前人栽樹后人乘涼,這樣的完整工具已經(jīng)有大神幫我們做好了。 原文:我的個人博客 https://mengkang.net/1356.html 工作了兩三年,技術(shù)停滯不前,迷茫沒有方向,不如看下我的直播 PHP 進(jìn)階之路 (金三銀四跳槽必考,一般人...
摘要:建模語言建模語言是可用于表達(dá)信息或知識或系統(tǒng)的任何人造語言,該結(jié)構(gòu)由一組一致的規(guī)則定義,目標(biāo)是可視化,推理,驗證和傳達(dá)系統(tǒng)設(shè)計。將這些文件安排到不同的地方稱為源代碼樹。源代碼樹的結(jié)構(gòu)通常反映了軟件的體系結(jié)構(gòu)。 大綱 軟件構(gòu)建的一般過程: 編程/重構(gòu) 審查和靜態(tài)代碼分析 調(diào)試(傾倒和記錄)和測試 動態(tài)代碼分析/分析 軟件構(gòu)建的狹義過程(Build): 構(gòu)建系統(tǒng):組件和過程 構(gòu)建變體...
摘要:是一個免費和開源的應(yīng)用,能夠集成至任何項目中,并收集和展示分析數(shù)據(jù)。它有沒有任何依賴,支持請求,包括常用開發(fā)庫的通用數(shù)據(jù)采集器和收集器。 DebugBar 是一個免費和開源的應(yīng)用,能夠集成至任何PHP項目中,并收集和展示分析數(shù)據(jù)。它有沒有任何依賴,支持Ajax請求,包括常用開發(fā)庫的通用數(shù)據(jù)采集器和收集器。 相信用過Laravel的調(diào)試工具的同學(xué),都感到這個工具非常強(qiáng)大好用,極大地提高了...
閱讀 3214·2021-11-08 13:18
閱讀 1366·2021-10-09 09:57
閱讀 1198·2021-09-22 15:33
閱讀 4001·2021-08-17 10:12
閱讀 5082·2021-08-16 11:02
閱讀 2695·2019-08-30 10:56
閱讀 978·2019-08-29 18:31
閱讀 3265·2019-08-29 16:30