PHP语法检查源代码之前的控制

参考是否有一个静态代码分析器[如Lint]的PHP文件? – 我正在研究如何在开发人员提交之前评估PHP文件的内容。 无论哪种解决scheme是适当的将通过类似于答案的SVN挂钩触发: 是否可以检查PHP的PHP文件语法?

当我检查到SVN这是我要去的angular度时,我遇到了PHP文件的自动语法检查 ,但是… php -l是不够的。

例如,给定代码:

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

这导致:

2012/01/15 02:51:14 [error] 694#0:* 164在stderr中发送FastCGI:“PHP注意:Undefinedvariables:foo

相比:

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

其中一些涉及教育编码人员的最佳做法。 不幸的是,有些人不像其他人那样快速学习,唯一能够确保符合编码标准的方法就是减less未经testing或不符合要求的SVN。

从这个问题的第一个环节来看,我试过了:

  • php -l
    • 不会通知$foo的问题
  • phplint-pure-c-1.0_20110223 – PHPLint
    • 不会通知$foo的问题
  if ($foo == 'bar') { \_ HERE 

==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44:警告:比较(未知)==(string):无法检查未知types之间的比较

  • phpcs – PHP代码嗅探器
    • 虽然PHP Sanity Check指出这是正确的答案,但不会通知$foo的问题
  • SimpleTest的
    • 是非常好的,但要求编写错误代码的开发人员编写好的unit testing。

所有这些都以他们自己的方式感兴趣,但没有一个能够捕捉到这些真正只在运行时才能find的问题。

欣赏关于这个话题的input/想法。

编辑

有一个海报build议PHPLint是正确的路要走。 我想,好的! 让我们再试一次,因为有一个新的版本: phplint-pure-c-1.1_20120202 :

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

简单的testing……………….., 它的工作原理和报告1错误,1警告。 但是,如果在if语句之前添加以下内容:

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

它不起作用 ,并报告0错误,2警告。

我认为这可能是一个分析仪有点难以发出警告。 例如,您提供的代码可以与帮助register_globals一起使用。 另外,它可能会在包含此文件的其他文件中定义。 由于这些原因,PHP文件应该与其他文件的完整上下文进行分析,这是非常可靠的,PHP /服务器configuration也应该是可用或定义的分析机制。

这就是说,你确定phplint没有做你想做的?

有一个在线validation器 ,你可以用它来testing它。 鉴于input:

 <?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()它没有发现任何问题。

编辑:所以对于这个其他的testing案例:

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

在Linux Mint 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. 

那么它是不是应该这样工作,并正确报告问题?

你可能想要结合phpcs(坚持编码标准)和一个新的项目由塞巴斯蒂安Bergmann: https : //github.com/sebastianbergmann/hphpa这利用Facebook的静态编译器来检查错误,如您的寻找..作为一个预先提交的钩子可能太多了,但是在你的构build系统中挂钩可能就足够了?

所有这些智能超级电动工具,窃听每一个门,看着每一个钥匙孔,将永远无法与运行代码的愚蠢和钝的行动竞争。

在repo中有可编译的,语法上有效的php文件的价值是什么? 你可以制作这样的文件,把它们定期提交到repo,放心,所有这些文件都会贡献给项目并添加一个可靠的特性,因为他们通过pre-commit钩子来检查其有效性?

人类编写的代码存在一系列问题,语法和缺失variables只是冰山一angular。 unit testing(如@NikiC所指出的)可以帮助很多。 在提交之前,开发人员有责任制作可靠的,有效的,文档化的代码并进行testing 。 使用未声明的variables的愚蠢错误是IDE可以指出的东西(例如,Zend Studio所做的)。 你的目标是创build好的工作软件,unit testing是关键。 这应该是我认为主要关心的问题。 有效的PHP文件是一个非常宽松的要求…

你可以使用第三方编译器有更多的编译时间选项,如phc( http://www.phpcompiler.org/doc/latest/runningphc.html#compiling-web-applications )? (或可能是嘻哈?)

然后我想:你需要Perl ::批评为PHP。

评论PHP的代码/ PerlCritic的PHP?

(也谷歌:perl批评为PHP)

我希望我可以更具体地帮助,但有时候这只是一个让你find解决scheme的想法。 这是我必须提供:)

大卫

噢,你需要的是PHPUnderControl! 它会检查你的语法,自动切换你的unit testing,做一个CRAP索引,以及更多的好东西。 这基本上是炸弹!

检查出来,这是url: http : //phpundercontrol.org/

而不是命令行检查器, PHPStorm必须是最好的IDE之一。

它有各种检查,可以检测到你提到的那种问题。 此外,它会自动重新运行这些检查你正在进行版本控制的文件,检查未定义的variables,质量差的代码和“todos”。

然而,这些检查的问题是,他们不知道所有的事情,所以他们有时会在“build议”或“警告”方面犯错,而不是错误。

但是它的function相当好,在编辑时会出现这种types的问题,而且通常会导致在任何提交操作之前纠正错误。