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