Skip to content

Checks [审查规则]

clover edited this page Jul 21, 2017 · 8 revisions

审查规则的可用列表

默认的配置文件是 config/default.cfg.xml

你可以通过创建一个新的配置文件并且注释某些验证规则或者给某些验证规则取消注释来实现特定的编码规范.

对于某些代码审查,你可以列出一些你不希望使用的规则的例外(exception).

你也可以通过给xml配置文件添加“level”属性来控制每个审查的报警级别(error 错误, warning 警告, info 通知).

如下是依据default配置文件得到的可以使用的验证规则.

命名规范

php内置函数

对于php系统的内置函数不做命名规范的检查,默认包含这些方法

  • __construct
  • __destruct
  • __call
  • __get
  • __set
  • __isset
  • __unset
  • __sleep
  • __wakeup
  • __toString
  • __clone
  • __autoload
  • __invoke
  • __callStatic

php内置变量

对于php系统内置的全局变量也不做命名规范检查,包括这些变量

  • $this
  • $_GET
  • $_POST
  • $_FILES
  • $_COOKIE
  • $_SESSION
  • $_ENV
  • $_SERVER
  • $_REQUEST
  • $HTTP_GET_VARS
  • $HTTP_POST_VARS
  • $HTTP_SERVER_VARS
  • $HTTP_ENV_VARS
  • $HTTP_SESSION_VARS

常量命名

检查常量是否符合命名规范.常量命名只能包含大写字母和下划线及数字,而且必须以大写字母开头. 可以通过修改正则来控制验证条件

变量命名

检查变量是否符合命名规范。 变量命名应该以小写字母或者下划线开头并且只包含字母、数字和下划线

如果你想更精确的检查,可以通过下面这些来进行区分:

  • topLevelVariableNaming : 顶级变量命名
  • localVariableNaming : 局部变量命名(在类中)
  • memberVariableNaming : 成员变量命名 (在方法或函数中)

函数命名

检查函数的命名是否符合命名规范 函数的名字一定要以小写字母开头(匹配规则是通过一个正则来自定义的,可以修改正则表达式更新验证规则) 特殊的函数比如“__construct”不会被检查

保护方法命名

激活保护方法的命名规范检测。验证规则同函数

私有方法命名

激活私有方法的命名规范检测。 私有方法应该以一个下划线紧跟一个小写字母开头,匹配规则可以自定义

构造函数命名

检查构造函数的命名规范。(通过设置value的值为new或old来选择)

  • old————函数的名字与类名保持一致
  • new————“__construct()”

类命名

检查类的命是否符合命名规范。 类的命名必须以大写字母开始。

接口命名

检查接口的命名规范。 接口命名规范与类相同

文件命名

检查php文件名是否符合命名规范。 必须以字母开头,且只能包含字母、数字、下划线(_)、和点(.)

局部变量长度

长度限制条件:length>=2 && lenght <=30。以下4个变量是例外:i,j,k(用于循环),e(用于异常$e)

PHP标签

不使用php短标签

必须使用"<?php"来开始一段php代码,短标签或者其他任何形式都不允许

不使用php结束标签

判断文件结尾是否存在一个php结束标签

不使用内联HTML元素结束标签noFileFinishHTML

判断是否以内联html元素结束文件(视图是ok的但是可能会报“header already sent”错误) Test if a file finish with some inner HTML.

php标签首行检查

php标签要永远在一行的开头

注释

不要使用shell脚本风格注释

检查是否包含shell/perl风格的注释(以#开头),禁止使用这种注释

docBlocks文档注释

检查每个函数和类之前是否都包含一个docBlock注释。 如果docBlocks包含"@inheritdoc" 那么所有的检查都会关闭。通过配置下面这些熟悉你可以配置检查的规则

  • Property excludePrivateMembers (true / false)(如果你想取消对私有方法的检查可以设置“excludePrivateMembers”属性为true)
  • Property testReturn (true / false)(是否检查返回值)
  • Property testParam (true / false)(是否检查参数)
  • Property testThrow (true / false)(是否检查抛出异常)
  • __toString方法不需要注释

强制头部

可以设置在文件的开头有一个强制的头部注释

/**
 * Header : Copyright notice ...
 */

缩进

缩进indentation

检查缩进类型。如果设置的为空格,那么会检查不包含tab字符,并且空格的数量是对的。如果设置的tab字符,那么会检查不包含空格。

控制结构包含花括号controlStructNeedCurly

检查确保每一个控制结构在一个 {}内, 即使它只是可选的.

控制结构起始花括号controlStructOpenCurly

检查起始花括号在控制结果中的位置。默认的位置是与控制语句同一行挨着控制语句。你可以设置它在新的一行通过修改position属性为“nl”.

  • sl same line 同一行
  • nl next line 下一行 示例: 起始花括号在同一行:
if ($ret === false) {
    // statements
}

同样的例子, 如果设置为在下一行:

if ($ret === false) 
{
    // statements
}

控制结构结束花括号controlCloseCurly

检查控制结构结束花括号的位置(应该在新的一行)

函数定义的起始花括号funcDefinitionOpenCurly

与上面类似,不过函数定义的起始花括号位置默认是在下一行

控制结果的else语句位置controlStructElse

检查else语句的默认位置

同一行 :

if ($ret === false) {
    // statements
} else {
}

新的一行:

if ($ret === false) {
    // statements
} 
else {
}

引号

优先的引号preferQuotes

定义优先的引号类型(单引号或者双引号) Defines the prefered style for quotes ("single" or "double").

空格

控制语句之后的空格spaceAfterControlStmt

判断控制语句("if", "else", "while", "for", 等.)之后紧跟一个空格在左圆括号之前。PEAR标准规定了这个,但是函数调用不适用。

函数名后面不要空格noSpaceAfterFunctionName

检查函数调用时函数名后面没有空格

checkWhiteSpaceAfter

检查某些符号(比如:, : )之后有一个空格

  • 可以定义一个例外列表.

checkWhiteSpaceBefore

检查某些符号之前有一个空格

  • 可以定义一个例外列表.

noSpaceBeforeToken

检查某些符号之前没有空格

  • A list of exceptions can be defined for this test.

noSpaceAfterToken

检查某些符合之后没有空格

  • A list of exceptions can be defined for this test.

Metrics 度量

行的长度lineLength

如果行的长度超过最大长度会报错(对于注释例外)

  • Proprety maxLineLength (default = 80).(设置该属性控制最大行长度,默认80)

函数的长度functionLength

检查函数的行数确保不超过最大行数

  • Proprety maxLength (default = 150).(设置该属性控制函数最大行数,默认150)

函数最大参数个数functionMaxParameters

检查函数声明的参数个数是否在限制内

  • Proprety maxParameters(default = 4).(设置该属性控制函数的最大参数数量,默认4)

圈复杂度cyclomaticComplexity

计算圈复杂度,达到了设定的数字会导致警告或错误。用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数。 计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,对应的计算公式为:V(G)=区域数=判定节点数+1。 See Cyclomatic Complexity

  • Proprety warningLevel (default = 10).(警告级别 10)
  • Proprety errorLevel(default = 20).(错误基本 20)

Npath复杂度npathComplexity

计算一个方法可能执行的路径总和 Calculates the NPath complexity (see NPath complexity explained).

  • Proprety warningLevel (default = 100).(警告级别100)
  • Proprety errorLevel(default = 200).(错误级别200)

被禁止的

检查禁用的函数checkProhibitedFunctions

检查被禁用的函数,基于安全考虑项目中有些函数要被禁用。默认列表 See the list of PHP functions here

  • system
  • echo
  • print_r
  • var_dump
  • dl
  • exec
  • die
  • phpinfo
  • unlink
  • delete
  • sql_regcase
  • passthru
  • magic_quotes_runtime
  • set_magic_quotes_runtime
  • define_syslog_variables

检查被禁用的记号checkProhibitedTokens

下列标记被禁用 See the list of PHP tokens here

  • T_BAD_CHARACTER
  • T_DECLARE
  • T_ENDDECLARE
  • T_ENDFOR
  • T_ENDFOREACH
  • T_ENDIF
  • T_ENDSWITCH
  • T_ENDWHILE
  • T_HALT_COMPILER
  • T_OLD_FUNCTION
  • T_PRINT

其他

函数参数默认值顺序defaultValuesOrder

检测函数所有包含默认值的参数是否在参数列表的最后

无报警错误?(不知道怎么翻译了...)checkSilencedError

Checks for silenced function calls.

  • A list of exceptions can be defined for this test.

包含变量的字符串encapsedVariablesInsideString

Checks for encapsed variables inside a String like "$a".

avoidPassingReferences

避免通过引用传递参数 Checks for functions have some passed by reference parameters.

showTODOs

从注释中提取TODO把他们添加到报告中 Extracts the TODO from the comments and add them in the report.

useBooleanOperators

使用bool运算符&& 或者 ||而不是 and 或or Tests for the presence of boolean operators (AND or OR) and recommend to replace them with boolean operators (&& or ||).

checkEmptyBlock

检查空括号,比如 if($a){} Check empty block like if ($a) {}

  • A list of exceptions can be defined for this test.

checkEmptyStatement

检查空语句(比如 ;;) Check empty statement ( ;; )

检查定界符checkHeredoc

Check for the presence of heredoc.

需要括号needBraces

块状代码需要被括号包起来 Check for braces around code blocs (if, else, elseif, do, while, for, foreach).

switchNeedDefault

switch必须要有一个default值

switchCaseNeedBreak

switch的case必须要有break语句

switchDefaultOrder

Switch默认值必须在最后

检查一元运算符checkUnaryOperator

不要在控制语句中使用一元运算符(如 ++ )。除了for循环,所有的变量增加或者变量减小应该发生在他们的顶级语句中,以此增加可读性

  • 可以定义例外列表(默认的有for).

检查内部(隐性)赋值checkInnerAssignment

在一个隐性赋值中很难找到一个变量是在哪里赋值的。除了迭代器(for循环),所有的赋值都应该在顶级语句中进行,以此增加可读性。

一个文件一个类oneClassPerFile

检测一个php文件中只包含一个类声明

检查空文件checkEmptyFile

“变变量”variableVariable

避免使用变变量(比如 $aa)

this变量不能在静态方法中使用thisInStatic

$this变量不能在静态方法中使用

没有使用的

checkUnusedPrivateFunctions

侦测没有使用的私有方法(检测没有使用的公有方法更难) Detect unused private functions (detecting unused public ones is more difficult).

检查没有使用的变量checkUnusedVariables

这个有点实验性的,可能产生负面效果(比如:在一个类里面声明的变量,在另外一个类里面使用了) This one is a bit experimental and can generate false positives (variables declared in one class and used in another one for example).

检测没有使用的函数参数checkUnusedFunctionParameters

如果函数的docBlocks包含了"@inheritdoc" 那么该检测将不会执行. If the docBlocks of the function contains "@inheritdoc" then this check is disabled.

检测没有使用的代码checkUnusedCode

检测没有使用的代码(在return或者throw之后) Detect unused code (after return or throw).

例如:

function foo { 
  // do something
  return;
  // do something else
}

优化

循环语句里的函数functionInsideLoop

避免在循环中使用count/sizeof函数 Avoid using a count/sizeof function inside a loop.

例如:

while ($a < count($b)) { 
  // do something
}

弃用的

检查弃用的函数checkDeprecation

检查弃用的函数,并推荐新的替代函数 Check for deprecated methods in PHP and propose some replacement.

例如:

split($a);
  • 函数split自从PHP 5.3就被弃用, 使用explode($pattern, $string) 或者 preg_split('@'.$pattern.'@', $string)来替代
  • old="call_user_method" new="call_user_func" version="4.1"
  • old="call_user_method_array" new="call_user_func_array" version="4.1"
  • old="define_syslog_variables" new="none" version="5.4"
  • old="dl" new="extension_loaded" version="5.3"
  • old="ereg" new="preg_match('@'.$pattern.'@', $string)" version="5.3"
  • old="eregi" new="preg_match('@'.$pattern.'@i', $string)" version="5.3"
  • old="ereg_replace" new="preg_replace('@'.$pattern.'@', $string)" version="5.3"
  • old="eregi_replace" new="preg_replace('@'.$pattern.'@i', $string)" version="5.3"
  • old="import_request_variables" new="none" version="5.4"
  • old="magic_quotes_runtime" new="none" version="5.3"
  • old="set_magic_quotes_runtime" new="none" version="5.3"
  • old="mcrypt_generic_end" new="mcrypt_generic_deinit" version="5.4"
  • old="mysql_list_dbs" new="none" version="5.4"
  • old="mysql_db_query" new="mysql_select_db and mysql_query" version="5.3"
  • old="mysql_escape_string" new="mysql_real_escape_string" version="5.3"
  • old="mysqli_bind_param" new="mysqli_stmt_bind_param" version="5.4"
  • old="mysqli_bind_result" new="mysqli_stmt_bind_result" version="5.4"
  • old="mysqli_client_encoding" new="mysqli_character_set_name" version="5.4"
  • old="mysqli_fetch" new="mysqli_stmt_fetch" version="5.4"
  • old="mysqli_param_count" new="mysqli_stmt_param_count" version="5.4"
  • old="mysqli_get_metadata" new="mysqli_stmt_result_metadata" version="5.4"
  • old="mysqli_send_long_data" new=" mysqli_stmt_send_long_data" version="5.4"
  • old="session_register" new="$_SESSION" version="5.3"
  • old="session_unregister" new="$_SESSION" version="5.3"
  • old="session_is_registered" new="$_SESSION" version="5.3"
  • old="set_socket_blocking" new="stream_set_blocking" version="5.3"
  • old="split" new="explode($pattern, $string) or preg_split('@'.$pattern.'@', $string)" version="5.3"
  • old="spliti" new="preg_split('@'.$pattern.'@i', $string)" version="5.3"
  • old="sql_regcase" new="none" version="5.3"
  • old="$HTTP_GET_VARS" new="$_GET" version="5.3"
  • old="$HTTP_POST_VARS" new="$_POST" version="5.3"
  • old="$HTTP_COOKIE_VARS" new="$_COOKIE" version="5.3"
  • old="$HTTP_SERVER_VARS" new="$_SERVER" version="5.3"
  • old="$HTTP_ENV_VARS" new="$_ENV" version="5.3"
  • old="$HTTP_SESSION_VARS" new="$_SESSION" version="5.3"

发现bug

严格比较strictCompare

检查应该被替换成严格比较的比较运算符 Check for the presence of comparison operators that should be replaced by strict comparisons.

例如:

if ($a != '0')

// should be
if ($a !== '0')

别名

checkAliases

检查弃用的方法并提供一个实现同样功能方法的函数 Check for methods that have been deprecated and are an alias of another method in PHP.

例如:

die;

// should be
exit()
  • old="chop" new="rtrim()"
  • old="close" new="closedir()"
  • old="die" new="exit()"
  • old="dir" new="getdir()"
  • old="doubleval" new="floatval()"
  • old="fputs" new="fwrite()"
  • old="ini_alter" new="ini_set()"
  • old="is_double" new="is_float()"
  • old="is_integer" new="is_int()"
  • old="is_long" new="is_int()"
  • old="is_real" new="is_float()"
  • old="is_writeable" new="is_writable()"
  • old="join" new="implode()"
  • old="key_exists" new="array_key_exists()"
  • old="magic_quotes_runtime" new="set_magic_quotes_runtime()"
  • old="pos" new="current()"
  • old="rewind" new="rewinddir()"
  • old="show_source" new="highlight_file()"
  • old="sizeof" new="count()"
  • old="strchr" new="strstr()"
Clone this wiki locally