PHP语法检查前源控制

sdo*_*lgy 34 php fastcgi syntax-checking

参考PHP文件是否有静态代码分析器[如Lint]?- 我正在研究如何在开发人员提交之前评估PHP文件的内容. 任何适合的解决方案都将通过类似答案的SVN钩子触发:是否可以从PHP检查PHP文件语法?

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

例如,给定代码:

if ($foo == 'bar') { 
     echo $foo;
}
Run Code Online (Sandbox Code Playgroud)

这导致:

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

相比:

if (isset($foo)) { echo $foo; }
Run Code Online (Sandbox Code Playgroud)

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

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

    if ($foo == 'bar') {
                     \_ HERE
Run Code Online (Sandbox Code Playgroud)

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

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

欣赏有关此主题的意见/想法.

编辑

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

 <?php
 if ($foo == 'bar') {
     echo $foo;
 }
 ?>
Run Code Online (Sandbox Code Playgroud)

简单测试....................并且,它工作并报告1个错误,1个警告.但是,如果在声明之前添加以下内容if:

 <?php
 if (isset($foo) && $foo == 'bar') { echo 'man'; }
 if ($foo == 'bar') { 
     echo $foo;
 }
 ?>
Run Code Online (Sandbox Code Playgroud)

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

eis*_*eis 11

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

那就是说,你确定phplint没有做你想做的吗?

有一个在线验证,你可以用它来测试它.鉴于输入:

<?php

echo $foo;
Run Code Online (Sandbox Code Playgroud)

结果是:

        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.
Run Code Online (Sandbox Code Playgroud)

而对于isset(),它没有发现任何问题.

编辑:所以对于其他测试用例:

<?php

if ($foo == 'bar') echo $foo;
Run Code Online (Sandbox Code Playgroud)

在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.
Run Code Online (Sandbox Code Playgroud)

并与此:

<?php

$foo = '1';
if ($foo == 1) echo $foo;
Run Code Online (Sandbox Code Playgroud)

它是:

$ 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.
Run Code Online (Sandbox Code Playgroud)

它是不是应该像它应该工作,并正确报告问题?


Gek*_*kie 8

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


Gri*_*lij 5

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

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

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