34

参考PHP 文件是否有静态代码分析器 [如 Lint]?--我正在研究如何在开发人员提交 PHP 文件之前评估它们的内容。 任何合适的解决方案都将通过类似于答案的 SVN 钩子触发:Is it possible to check PHP file syntax from PHP?

在签入 SVN 时遇到了 PHP 文件的自动语法检查,这是我想要的角度,但是......php -l还不够。

例如,给定代码:

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

这导致:

2012/01/15 02:51:14 [错误] 694#0: *164 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 个警告。但是,如果在语句之前 添加以下内容:if

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

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

4

6 回答 6

11

我认为这对于分析器来说可能有点难以发出警告。例如,您提供的代码可能与帮助 register_globals 一起使用。此外,它可能在包含此文件的其他文件中定义。由于这些原因,应该使用其他文件的完整上下文来分析 PHP 文件以使其真正可靠,并且 PHP/服务器配置也应该对分析机制可用或定义。

也就是说,你确定 phplint 不会做你想做的事吗?

有一个在线验证器可用于测试它。给定输入:

<?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.

那么它不是按应有的方式工作并正确报告问题吗?

于 2012-01-15T11:23:51.310 回答
8

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

于 2012-02-07T09:36:54.540 回答
5

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

在 repo 中有可编译的、语法上有效的 php 文件有什么价值?您可以制作这些文件的 zounds,定期将它们提交到 repo,请放心,它们都为项目做出了贡献并添加了某些可靠的功能,因为,好吧,它们通过了 pre-commit 钩子来检查他们的有效性?

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

于 2012-03-10T22:54:42.293 回答
2

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

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

为 PHP 批评 PHP 代码/PerlCritic?

(也谷歌:perl 批评者为 php )

我希望我能提供更具体的帮助,但有时这只是一个让您找到解决方案的想法。这就是我必须提供的:)

大卫

于 2012-02-02T03:46:53.680 回答
1

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

看看,这里是网址: http: //phpundercontrol.org/

于 2012-04-25T01:49:39.820 回答
0

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

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

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

但是,它非常擅长它的工作,并且在您编辑时它可能会出现这些问题,并且通常它会导致在任何提交操作之前修复错误。

于 2012-04-25T12:51:56.653 回答