PHP静态代码扫描工具的使用

Posted by jintang on 2017-12-21

环境准备

环境依赖

  • php
  • composer
  • git

准备工作

本文所有用到的工具,都可以通过composer来安装,为了把工具集中起来,我们建立一个composer project来统一存放

按照个人喜好,我创建一个名为”php-quality-tools”的工程

script
1
2
3
> mkdir php-quality-tools
> cd php-quality-tools
> composer init # 会有个交互过程,一直回车就行

加入环境变量:

script
1
2
3
4
5
6
# linux/mac环境
> cd /path/to/php-qulity-tools
> echo "export PATH=\$PATH:`pwd`/vendor/bin" >> ~/.bash_profile
> source ~/.bash_profile # 马上生效

# windows请百度一下"windows环境变量设置"

加入环境变量的解释:

根据composer工程的特征,vendor目录用于存放依赖的包,我们的所有工具(如phplint、phpcs等)都使用依赖包的方式进行安装,而相应的二进制文件(windows为.bat)文件会存放在各自的依赖包目录下的bin文件夹中,同时会通过ln的方式汇总一份到vendor/bin目录下,所以/path/to/php-quality-tools/vendor/bin加入环境变量就可以直接使用工具命令了。

检查工具安装及使用

PHP命令

其实PHP自带有语法检查的命令

script
1
> php -l xxx.php

但是输出比较简单,使用并不是很友好

PHPLint

语法检测器

功能

用于检测php是否有语法错误

安装

script
1
2
3
4
5
> cd /path/to/php-quality-tools
> composer require --dev overtrue/phplint
# 安装成功后,验证一下
> phplint -V
phplint 2.0.2

使用

有以下代码:test.php

1
2
3
4
5
6
7
8
<?php 
$var = 1;
foo($var)

function foo($var)
{
echo $var, "\n";
}

结果:

script
1
2
3
4
5
6
7
8
9
10
11
12
13

> phplint test.php

There was 1 errors:
1. /Users/jaych/Codes/projects/blake/src/test/test.php:5
2|
3| $var = 1;
4|
> 5| foo($var;
6|
7| function foo($var)
8| {
unexpected ';', expecting ')' in line 5

phpcs与phpcbf

  • phpcs: PHP代码嗅探器
  • phpcbf: PHP代码美化器

安装

两个工具都在同一个包中,所以一起安装就可以了

script
1
2
> cd /path/to/php-quality-tools
> composer require --dev squizlabs/php_codesniffer

使用

查看支持的代码规范标准

script
1
2
3
4
> phpcs -i
The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1 and PSR12
> phpcbf -i
The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1 and PSR12

检查代码,有如下代码:test.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php 

class Foo {
private $foo1 = 100;
private $foo2 = 200;
public function hello(){
if($this->foo1>$this->foo2){
$foo3 = "good!";
}
echo "say hello!";
}
}

结果:

script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
> phpcs --extensions=php --standard=PSR2,PSR1 test.php

FILE: /Users/jaych/Codes/projects/blake/src/test/test.php
---------------------------------------------------------------------------------------------------
FOUND 5 ERRORS AFFECTING 3 LINES
---------------------------------------------------------------------------------------------------
3 | ERROR | [ ] Each class must be in a namespace of at least one level (a top-level vendor name)
3 | ERROR | [x] Opening brace of a class must be on the line after the definition
8 | ERROR | [x] Opening brace should be on a new line
9 | ERROR | [x] Expected 1 space(s) after IF keyword; 0 found
9 | ERROR | [x] Expected 1 space(s) after closing parenthesis; found 0
---------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 4 MARKED SNIFF VIOLATIONS AUTOMATICALLY
---------------------------------------------------------------------------------------------------

Time: 232ms; Memory: 6MB

> phpcbf --extensions=php --standard=PSR2,PSR1 test.php

PHPCBF RESULT SUMMARY
------------------------------------------------------------------------
FILE FIXED REMAINING
------------------------------------------------------------------------
/Users/jaych/Codes/projects/blake/src/test/test.php 4 1
------------------------------------------------------------------------
A TOTAL OF 4 ERRORS WERE FIXED IN 1 FILE
------------------------------------------------------------------------

Time: 355ms; Memory: 6MB

与PHPStorm的整合

强大的IDE编辑器都会有提供一些对应的辅助功能来做代码规范提示,下面来展示phpcs与phpstorm的整合方法

PHPStorm点开配置 > languages & frameworks > PHP > Quality Tools 第一栏 php_codesniffer (已更新为2019.03版本的phpstorm的配置方法)



配置”inspection”: 配置 > Editor > PHP > Inspections

PHPStorm中的Inspection提示效果

PHPStorm IDE编辑器自带的格式化工具

首先设置Code Style为 PSR1/PSR2

其实PHPStorm格式化代码的功能”Reformat code”和”Optimize imports”

使用”Marco”做动作打包,并且加入到保存快捷键中,这样保存的时候就自动做好code reformat和optimize imports了

进阶代码规范修复器:php-cs-fixer

与phpcbf类似,但是能够修复的内容会更多

安装

script
1
> composer require --dev friendsofphp/php-cs-fixer

与PHPStorm整合

效果

phpmd

针对有可能因为不好的编程习惯和一些bad coding导致出现一些潜在的问题给出优化建议

安装

script
1
> composer require --dev phpmd/phpmd

使用

script
1
> phpmd /path/to/sources text design,cleancode

与PHPStorm整合

效果