如何清理和简化此代码?

时间:2010-05-03 22:21:11

标签: php coding-style

在考虑This Question并给出答案之后,我想做更多关于培训自己的事情。

所以我写了一个函数来计算给定函数的长度。给定的php文件必须从所需函数的开头开始。 示例:如果函数位于包含大量函数的大型phpfile中,例如

/* lots of functions */
function f_interesting($arg) {
    /* function */
}
/* lots of other functions */

然后$ part3我的函数将需要像那样开始(在有趣函数的起始 - {之后):

    /* function */
}
/* lots of other functions */

现在这不是问题,但我想知道是否有更简洁或更简单的方法来做到这一点。这是我的功能:(我已经清理了很多测试 - echo - 命令) (其背后的想法被解释为here

function f_analysis ($part3) {
    if(isset($part3)) {
        $char_array = str_split($part3); //get array of chars
        $end_key = false; //length of function
        $depth = 0; //How much of unclosed '{'
        $in_sstr = false; //is next char inside in ''-String?
        $in_dstr = false; //is nect char inside an ""-String?
        $in_sl_comment = false; //inside an //-comment?
        $in_ml_comment = false; //inside an /* */-comment?
        $may_comment = false; //was the last char an '/' which can start a comment?
        $may_ml_comment_end = false; //was the last char an '*' which may end a /**/-comment?
        foreach($char_array as $key=>$char) {
            if($in_sstr) {
                if ($char == "'") {
                    $in_sstr = false;
                }
            }
            else if($in_dstr) {
                if($char == '"') {
                    $in_dstr = false;
                }
            }
            else if($in_sl_comment) {
                if($char == "\n") {
                    $in_sl_comment = false;
                }
            }
            else if($in_ml_comment) {
                if($may_ml_comment_end) {
                    $may_ml_comment_end = false;
                    if($char == '/') {
                        $in_ml_comment = false;
                    }
                }
                if($char == '*') {
                    $may_ml_comment_end = true;
                }
            }
            else if ($may_comment) {
                if($char == '/') {
                    $in_sl_comment = true;
                }
                else if($char == '*') {
                    $in_ml_comment = true;
                }
                $may_comment = false;
            }
            else {
                switch ($char) {
                    case '{':
                        $depth++;
                        break;
                    case '}':
                        $depth--;
                        break;
                    case '/':
                        $may_comment = true;
                        break;
                    case '"':
                        $in_dstr = true;
                        break;
                    case "'":
                        $in_sstr = true;
                        break;
                }
            }

            if($depth < 0) {
                $last_key = $key;
                break;
            }
        }
    } else echo '<br>$part3 of f_analysis not set!';
    return ($last_key===false) ? false : $last_key+1; //will be false or the length of the function
}

2 个答案:

答案 0 :(得分:1)

TokenizerExample - 了解它,喜欢它。

答案 1 :(得分:0)

你可能会稍微减少状态变量的数量,但实际上......是的,这将是凌乱的代码。例如,当我遇到星号时,我可能会摆脱$may_ml_comment_end并向前看下一个角色。您需要将foreach循环重写为常规for循环才能做到这一点而不会造成更大的混乱。

PS:我没有看到你处理转义字符。如果没有上述方法,那将引入另一个布尔变量。

您当前代码的另一个问题是紧跟/之后的字符未按其应有的方式解释。不太可能

echo 5/'2';  // NB: no space in between

在PHP中有效,会破坏您的解析器。