引用 Is there a static code analyzer [like Lint] for PHP files? -- 我正在研究如何在开发人员提交 PHP 文件之前对其内容进行评估。 任何合适的解决方案都将通过类似于答案的 SVN 钩子(Hook)触发: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 [error] 694#0: *164 FastCGI sent in stderr: "PHP Notice: Undefined variable: foo
相比:
if (isset($foo)) { echo $foo; }
其中一部分归结为对编码人员进行最佳实践教育。不幸的是,有些人的学习速度不如其他人快,而确保符合编码标准的唯一方法是减少未经测试或不合规的进入 SVN 的内容。
从这个问题的第一个链接,我已经尝试过:
- php -l
- 不通知
$foo
的问题
- 不通知
- phplint-pure-c-1.0_20110223 - PHPLint
- 不通知
$foo
的问题
- 不通知
if ($foo == 'bar') { \_ HERE
==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types
- phpcs - PHP Code Sniffer
- 不通知
$foo
的问题,尽管 PHP Sanity Check表明这是正确的答案
- 不通知
- SimpleTest
- 非常好,但需要编写糟糕代码的开发人员编写好的单元测试...
所有这些都以自己的方式有趣,但没有人发现这些真正只能在运行时发现的问题。
感谢有关此主题的意见/想法。
编辑
有一位发帖人建议 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 个警告。
最佳答案
我认为这对于分析器来说可能有点难以发出警告。例如,您提供的代码可能与帮助 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.
所以它不是按应有的方式工作并正确报告问题吗?
关于PHP 语法检查预源代码控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869209/