2012-01-15 43 views
34

參考Is there a static code analyzer [like Lint] for PHP files? - 我正在研究如何評估開發人員提交PHP文件之前的內容。無論溶液(S)是合適的將通過SVN觸發類似的鉤的答案:Is it possible to check PHP file syntax from PHP?PHP語法檢查源代碼前控制

我碰到這個Automatic Syntax checking of PHP files when checking into SVN這是我要的,角度然而... php -l是不是就足夠了。

例如,假設代碼:

if ($foo == 'bar') { 
    echo $foo; 
} 

這導致:

2012/01/15 02:51:14 [error] 694#0: *164 FastCGI sent in stderr: "PHP Notice: Undefined variable: foo

相比:

if (isset($foo)) { echo $foo; } 

一些這歸結爲最佳實踐教育打碼機。不幸的是,有些人不像其他人那樣快速學習,並且唯一能夠確保符合編碼標準的方法是減少未經測試或不合規的SVN。

在這個問題上的第一個鏈接,我曾嘗試:

if ($foo == 'bar') { 
        \_ HERE 

==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types

全部都是以自己的方式有趣,但沒有正趕上這些這些問題真的只能在運行時才能找到。

欣賞關於此主題的輸入/想法。

編輯

有一張海報誰建議PHPLint是正確的道路要走。我想,好的!讓我們試着再次因爲有一個新版本:phplint-pure-c-1.1_20120202

<?php 
if ($foo == 'bar') { 
    echo $foo; 
} 
?> 

簡單測試....................和,它的工作原理和報告1個錯誤,1個警告。但是,如果現加入之前if聲明:

<?php 
if (isset($foo) && $foo == 'bar') { echo 'man'; } 
if ($foo == 'bar') { 
    echo $foo; 
} 
?> 

它不工作,並報告0個錯誤,2個警告。

+8

老實說,讓他們寫單元測試。語法檢查不會找到大多數故障。單元測試會。 – NikiC 2012-02-10 07:45:16

+6

在svn pre-commit鉤子中做這樣的事情時要非常小心。事實上,我會說扁平化不這樣做。除非提交被拒絕,否則你不能看到svn pre-commit hook的輸出 - 當你基於非嚴重錯誤阻止提交時,這可能會造成令人難以置信的破壞性。除非您重視高於生產力的一致性,否則最好在開發人員的機器上實施此類檢查。考慮到你使用svn,綁定到你的構建系統會更合適。 – AD7six 2012-02-10 16:52:11

+0

總會有一些情況不能按照你想要的方式工作。這並沒有改變phplint做你最初的要求。請注意,我其實並沒有說你應該使用它 - 我只是暗示它符合你提出的要求。 – eis 2012-02-16 12:58:14

回答

11

我認爲這可能有點難以讓分析儀發出警告。例如,您給出的代碼可能是與幫助register_globals一起使用。另外,它可能會在包含此文件的其他文件中定義。出於這些原因,PHP文件應該用其他文件的完整上下文進行分析,因爲這是非常可靠的,並且PHP /服務器配置也應該可用或定義到分析機制。

這就是說,你確定phplint沒有做你想做的事嗎?

有一個online validator,你可以用它來測試它。鑑於輸入:

<?php 

echo $foo; 

結果是:

 echo $foo; 
        \_ HERE 
==== 3: ERROR: variable `$foo' has not been assigned 
END parsing of test-qBlPWw 
==== ?: notice: unused package `dummy.php' 
==== ?: notice: unused module `standard' 
Overall test results: 1 errors, 0 warnings. 

而用isset()函數沒有發現任何問題。

編輯:因此對於該另一測試情況:

<?php 

if ($foo == 'bar') echo $foo; 

在Linux薄荷8的響應是:

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: ERROR: variable `$foo' has not been assigned 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:3: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types 
Overall test results: 1 errors, 1 warnings. 

以及與此:

<?php 

$foo = '1'; 
if ($foo == 1) echo $foo; 

它是:

$ src/phplint test.php 
/home/vadmin/phplint/phplint-pure-c-1.0_20110223/test.php:6: ERROR: comparing (string) == (int) 
Overall test results: 1 errors, 0 warnings. 

所以不是它應該這樣工作,並正確報告問題?

+0

嗨,我沒有使用在線驗證器,因爲我們不會通過組織外部的代碼發送我們的代碼...我下載並編譯了PHPLint代碼並在本地運行,但沒有返回您所顯示的內容 – sdolgy 2012-01-15 11:35:06

+0

是,我並不是說你應該在你的應用程序中使用在線驗證器......我的意思是說在線驗證器應該和本地驗證器一樣。在本地安裝phplint-windows-1.020110223的結果是一樣的:BEGIN解析example.php 1:\t <?php 2:\t 3:\t echo $ foo; \t echo $ foo; \t \ _ HERE ==== example.php:3:錯誤:變量'$ foo'尚未分配 END分析example.php 總體測試結果:1個錯誤,0個警告。 – eis 2012-01-15 11:51:04

+0

不錯。在linux上編譯phplint-pure-c-1.0_20110223會給出不同的結果。真棒。 – sdolgy 2012-01-15 11:53:04

8

你可能想通過塞巴斯蒂安伯格曼於phpcs(堅持編碼標準)和一個新的項目組合:https://github.com/sebastianbergmann/hphpa這被Facebook以檢查利用靜態編譯錯誤,比如你正在尋找的......可能是一個預先提交鉤子太多了,但是你的構建系統中的鉤子可能就足夠了?

5

所有這些智能超級電動工具,竊聽每扇門,看着每一個鑰匙孔,將永遠無法與運行的愚蠢和鈍行動競爭的代碼。

在回購中有可編譯的,語法上有效的php文件的價值是什麼?您可以對這些文件進行劃分,定期將其提交到回購站,並放心,所有這些文件都爲該項目做出貢獻並添加一定的可靠功能,因爲他們通過預先提交掛鉤來檢查其有效性?

人類編寫的代碼存在一系列問題,語法和缺失變量只是冰山一角。單元測試(如@NikiC指出的)可以幫助很多。在開始之前,開發人員有責任制作可靠的,有效的,文件化的代碼和測試。使用未聲明的變量的愚蠢錯誤是IDE可以指出的東西(比如Zend Studio)。你的目標是創造良好的工作軟件和單元測試是關鍵。這應該是我認爲的主要關注點。有效的PHP文件是一個非常寬鬆的要求...

1

哦,是的,你需要的是PHPUnderControl!它會檢查你的語法,自動切換你的單元測試,做一個C.R.A.P.索引和更多好東西。它基本上是炸彈!

檢查出來,這裏是網址:http://phpundercontrol.org/

0

,而不是一個命令行檢查,PHPStorm已經是最好的IDE的出來的一個人也沒有。

它有各種檢查,可以檢測到你所提到的那種問題。此外,它會自動將這些檢查重新運行到您正在進行版本控制的文件上,檢查未定義的變量,劣質代碼和「todos」。

然而,這些檢查的問題是,他們無法知道所有事情,所以他們有時會在提出建議或警告而不是錯誤方面犯錯。

但是,它的功能非常好,在編輯時會出現這些問題,並且通常會導致在任何提交操作之前糾正錯誤。