-
Notifications
You must be signed in to change notification settings - Fork 31
Checks [审查规则]
默认的配置文件是 config/default.cfg.xml
你可以通过创建一个新的配置文件并且注释某些验证规则或者给某些验证规则取消注释来实现特定的编码规范.
对于某些代码审查,你可以列出一些你不希望使用的规则的例外(exception).
你也可以通过给xml配置文件添加“level”属性来控制每个审查的报警级别(error 错误, warning 警告, info 通知).
如下是依据default配置文件得到的可以使用的验证规则.
对于php系统的内置函数不做命名规范的检查,默认包含这些方法
- __construct
- __destruct
- __call
- __get
- __set
- __isset
- __unset
- __sleep
- __wakeup
- __toString
- __clone
- __autoload
- __invoke
- __callStatic
对于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结束标签
判断是否以内联html元素结束文件(视图是ok的但是可能会报“header already sent”错误) Test if a file finish with some inner HTML.
php标签要永远在一行的开头
检查是否包含shell/perl风格的注释(以#开头),禁止使用这种注释
检查每个函数和类之前是否都包含一个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 ...
*/
检查缩进类型。如果设置的为空格,那么会检查不包含tab字符,并且空格的数量是对的。如果设置的tab字符,那么会检查不包含空格。
检查确保每一个控制结构在一个 {}内, 即使它只是可选的.
检查起始花括号在控制结果中的位置。默认的位置是与控制语句同一行挨着控制语句。你可以设置它在新的一行通过修改position属性为“nl”.
- sl same line 同一行
- nl next line 下一行 示例: 起始花括号在同一行:
if ($ret === false) {
// statements
}
同样的例子, 如果设置为在下一行:
if ($ret === false)
{
// statements
}
检查控制结构结束花括号的位置(应该在新的一行)
与上面类似,不过函数定义的起始花括号位置默认是在下一行
检查else语句的默认位置
同一行 :
if ($ret === false) {
// statements
} else {
}
新的一行:
if ($ret === false) {
// statements
}
else {
}
定义优先的引号类型(单引号或者双引号) Defines the prefered style for quotes ("single" or "double").
判断控制语句("if", "else", "while", "for", 等.)之后紧跟一个空格在左圆括号之前。PEAR标准规定了这个,但是函数调用不适用。
检查函数调用时函数名后面没有空格
检查某些符号(比如:, : )之后有一个空格
- 可以定义一个例外列表.
检查某些符号之前有一个空格
- 可以定义一个例外列表.
检查某些符号之前没有空格
- A list of exceptions can be defined for this test.
检查某些符合之后没有空格
- A list of exceptions can be defined for this test.
如果行的长度超过最大长度会报错(对于注释例外)
- Proprety maxLineLength (default = 80).(设置该属性控制最大行长度,默认80)
检查函数的行数确保不超过最大行数
- Proprety maxLength (default = 150).(设置该属性控制函数最大行数,默认150)
检查函数声明的参数个数是否在限制内
- Proprety maxParameters(default = 4).(设置该属性控制函数的最大参数数量,默认4)
计算圈复杂度,达到了设定的数字会导致警告或错误。用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数。 计算公式为:V(G)=e-n+2。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数,对应的计算公式为:V(G)=区域数=判定节点数+1。 See Cyclomatic Complexity
- Proprety warningLevel (default = 10).(警告级别 10)
- Proprety errorLevel(default = 20).(错误基本 20)
计算一个方法可能执行的路径总和 Calculates the NPath complexity (see NPath complexity explained).
- Proprety warningLevel (default = 100).(警告级别100)
- Proprety errorLevel(default = 200).(错误级别200)
检查被禁用的函数,基于安全考虑项目中有些函数要被禁用。默认列表 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
下列标记被禁用 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
检测函数所有包含默认值的参数是否在参数列表的最后
Checks for silenced function calls.
- A list of exceptions can be defined for this test.
Checks for encapsed variables inside a String like "$a".
避免通过引用传递参数 Checks for functions have some passed by reference parameters.
从注释中提取TODO把他们添加到报告中 Extracts the TODO from the comments and add them in the report.
使用bool运算符&& 或者 ||而不是 and 或or Tests for the presence of boolean operators (AND or OR) and recommend to replace them with boolean operators (&& or ||).
检查空括号,比如 if($a){} Check empty block like if ($a) {}
- A list of exceptions can be defined for this test.
检查空语句(比如 ;;) Check empty statement ( ;; )
Check for the presence of heredoc.
块状代码需要被括号包起来 Check for braces around code blocs (if, else, elseif, do, while, for, foreach).
switch必须要有一个default值
switch的case必须要有break语句
Switch默认值必须在最后
不要在控制语句中使用一元运算符(如 ++ )。除了for循环,所有的变量增加或者变量减小应该发生在他们的顶级语句中,以此增加可读性
- 可以定义例外列表(默认的有for).
在一个隐性赋值中很难找到一个变量是在哪里赋值的。除了迭代器(for循环),所有的赋值都应该在顶级语句中进行,以此增加可读性。
检测一个php文件中只包含一个类声明
避免使用变变量(比如 $aa)
$this变量不能在静态方法中使用
侦测没有使用的私有方法(检测没有使用的公有方法更难) Detect unused private functions (detecting unused public ones is more difficult).
这个有点实验性的,可能产生负面效果(比如:在一个类里面声明的变量,在另外一个类里面使用了) This one is a bit experimental and can generate false positives (variables declared in one class and used in another one for example).
如果函数的docBlocks包含了"@inheritdoc" 那么该检测将不会执行. If the docBlocks of the function contains "@inheritdoc" then this check is disabled.
检测没有使用的代码(在return或者throw之后) Detect unused code (after return or throw).
例如:
function foo {
// do something
return;
// do something else
}
避免在循环中使用count/sizeof函数 Avoid using a count/sizeof function inside a loop.
例如:
while ($a < count($b)) {
// do something
}
检查弃用的函数,并推荐新的替代函数 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"
检查应该被替换成严格比较的比较运算符 Check for the presence of comparison operators that should be replaced by strict comparisons.
例如:
if ($a != '0')
// should be
if ($a !== '0')
检查弃用的方法并提供一个实现同样功能方法的函数 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()"