PHP语法检查前源控制

时间:2012-01-15 11:06:48

标签: php fastcgi syntax-checking

参考Is there a static code analyzer [like Lint] for PHP files? - 我正在研究如何在开发人员提交之前评估PHP文件的内容。将通过SVN触发适当的解决方案钩子类似答案:Is it possible to check PHP file syntax from PHP?

我遇到了这个Automatic Syntax checking of PHP files when checking into SVN,这是我想要的角度,但是...... php -l还不够。

例如,给定代码:

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

这导致:

  

2012/01/15 02:51:14 [错误] 694#0:* 164 stderr发送的FastCGI:“PHP注意:未定义的变量:foo

与:相比:

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

其中一些归结为教育程序员最佳实践。不幸的是,有些人没有像其他人那样快速学习,并且确保符合编码标准的唯一方法是减少进入未经测试或不符合要求的SVN。

从这个问题的第一个链接开始,我尝试过:

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

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

所有这些都以他们自己的方式感兴趣,但是没有人能够捕获这些仅在运行时才能找到的问题。

欣赏有关此主题的意见。

修改

有一张海报表明PHPLint是正确的方法。我想,好的!让我们再试一次,因为有一个新版本:phplint-pure-c-1.1_20120202

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

简单测试....................和工作并报告1错误,1警告。但是,如果 BEFORE if语句添加以下内容:

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

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

6 个答案:

答案 0 :(得分: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 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.

所以它不应该像它应该的那样工作,并正确报告问题吗?

答案 1 :(得分:8)

您可能希望结合使用phpcs(以遵守编码标准)和Sebastian Bergmann的新项目:https://github.com/sebastianbergmann/hphpa这利用facebook的静态编译器来检查错误,例如您正在寻找...可能是太多作为预提交钩子,但是你的构建系统的钩子可能就足够了吗?

答案 2 :(得分:5)

所有这些窃听每扇门并查看每个钥匙孔的智能超级电动工具都无法与 RUNNING 代码的愚蠢和生硬的行为竞争。

在repo中拥有可编译的,语法上有效的php文件的价值是什么?你可以创建这些文件的大小,定期将它们提交给repo,并且放心,所有这些文件都有助于项目并添加一个可靠的功能,因为,他们通过预提交钩子来检查他们的有效性?

人类编写的代码存在一些问题,语法和缺失的变量只是冰山一角。单元测试(由@NikiC指出)有很大帮助。在提交之前,开发人员有责任制作可靠,有效,有文档的代码并测试。使用未声明的变量的愚蠢错误是IDE可以指出的(例如Zend Studio)。您的目标是创建良好的工作软件,单元测试是关键。这应该是我认为的主要问题。有效的php文件是一个非常宽松的要求......

答案 3 :(得分:2)

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

然后我想:你需要Perl :: Critic for php。

Critiquing PHP-code / PerlCritic for PHP?

(也是谷歌:perl评论家为php)

我希望自己可以更具体地提供帮助,但有时候这只是一个让你了解解决方案的想法。这就是我要提供的:)

大卫

答案 4 :(得分:1)

哦,是的,你需要的是PHPUnderControl!它会检查你的语法,自动查看你的单元测试,做一个C.R.A.P.索引,还有更好的东西。它基本上就是炸弹!

检查一下,这是网址:http://phpundercontrol.org/

答案 5 :(得分:0)

虽然不是命令行检查程序,PHPStorm必须是最好的IDE之一。

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

然而,这些检查的问题在于他们无法知道所有事情,所以他们有时会因为“建议”或“警告”而不是错误而犯错误。

但是,它的功能非常好,而且在编辑时会出现这些问题,并且通常会导致在任何提交操作之前很好地修复错误。