PHP 语法检查预源代码控制

标签 php fastcgi syntax-checking

引用 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 的内容。

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

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

==== /mnt/hgfs/workspace/scratch-pad/phpinfo.php:44: Warning: comparing (unknown) == (string): cannot check the comparison between unknown types

所有这些都以自己的方式有趣,但没有人发现这些真正只能在运行时发现的问题。

感谢有关此主题的意见/想法。

编辑

有一位发帖人建议 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/

相关文章:

intellij-idea - 智能 IDEA。检查没有扩展名的文件的语法

javascript - php 中的 json_decoded 数组 - 获取键和值

php - 如何避免在客户端暴露ajax调用

php - 如何使用另一个数组中的字符串作为位置名称在 PHP 中创建数组?

nginx - fastcgi 多路复用?

php - 检查 PHP 文件的语法错误

PHP 电子邮件验证

apache2 - 对等方重置 Apache PHP5-FPM 连接

django - Microsoft Azure 将额外的查询字符串附加到带有查询字符串的 URL

php 编译器或语法检查器