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
的问题
- 虽然PHP Sanity Check指出这是正确的答案,但不会通知
- 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的问题,而且通常会导致在任何提交操作之前纠正错误。