<?php
function calculateComplexity($code) {
$tokens = token_get_all($code);
$complexity = 1; // 基础复杂度
$complexityTokens = [
T_IF, T_ELSEIF, T_FOR, T_FOREACH,
T_WHILE, T_CASE, T_CATCH, T_LOGICAL_AND, T_LOGICAL_OR
];
foreach ($tokens as $token) {
if (is_array($token) && in_array($token[0], $complexityTokens)) {
$complexity++;
}
}
return $complexity;
}
$code = '<?php
function example($x) {
if ($x > 0) {
for ($i = 0; $i < $x; $i++) {
if ($i % 2 == 0) {
echo $i;
}
}
}
}
?>';
echo "圈复杂度: " . calculateComplexity($code); // 4
- 程序功能概述
这段代码实现了一个计算PHP代码圈复杂度(Cyclomatic Complexity)的函数。圈复杂度是衡量代码复杂度的指标,数值越高表示代码越复杂、越难维护。
- 核心函数解析
calculateComplexity($code) 函数
function calculateComplexity($code) {
$tokens = token_get_all($code); // 将代码解析为token数组
$complexity = 1; // 基础复杂度
// 定义会增加复杂度的token类型
$complexityTokens = [
T_IF, T_ELSEIF, T_FOR, T_FOREACH,
T_WHILE, T_CASE, T_CATCH, T_LOGICAL_AND, T_LOGICAL_OR
];
// 遍历所有token
foreach ($tokens as $token) {
if (is_array($token) && in_array($token[0], $complexityTokens)) {
$complexity++; // 遇到复杂度token就增加计数
}
}
return $complexity;
}
- 关键组件详解
token_get_all($code)
· PHP内置函数,将源代码解析成token数组
· 每个token可能是:
· 数组:[token_id, token_string, line_number]
· 字符串:简单的符号如 {, }, ; 等
复杂度token列表
T_IF, // if 语句
T_ELSEIF, // elseif 语句
T_FOR, // for 循环
T_FOREACH, // foreach 循环
T_WHILE, // while 循环
T_CASE, // switch-case 中的 case
T_CATCH, // try-catch 中的 catch
T_LOGICAL_AND, // 逻辑与 &&
T_LOGICAL_OR // 逻辑或 ||
- 示例代码分析
function example($x) {
if ($x > 0) { // 第1个if → 复杂度+1
for ($i = 0; $i < $x; $i++) { // 第1个for → 复杂度+1
if ($i % 2 == 0) { // 第2个if → 复杂度+1
echo $i;
}
}
}
}
复杂度计算过程:
· 基础复杂度:1
· 遇到第一个 if:1+1=2
· 遇到 for:2+1=3
· 遇到第二个 if:3+1=4
最终结果:4
- 圈复杂度意义
复杂度范围 代码质量 建议
1-10 良好 易于理解和测试
11-20 中等 考虑重构
21-30 复杂 需要重构
31+ 极其复杂 必须重构