【问题标题】:Get return values of code with tokenizer使用分词器获取代码的返回值
【发布时间】:2013-08-06 18:57:50
【问题描述】:

我正在尝试使用 token_get_all() 解析 PHP 源代码。到目前为止,该函数一切正常,但现在我需要一种方法来获取方法的返回值。

确定return 的完成位置不是问题。我只是看不到获取 return 值之后的代码的方法。

以这段代码为例:

<?php
    class Bla {
        public function Test1()
        {
            $t = true;

            if($t) {
                return 1;
            }

            return 0;
        }

        public function Test2()
        {
            echo "bbb";
            return; // nothing is returned
        }

        public function Test3()
        {
            echo "ccc";
            $someval1 = 1;
            $someval2 = 2;

            return ($someval + $otherval)*2;
        }
    }
?>

我使用get_token_all() 来确定@​​987654326@ 的完成位置:

$newStr  = '';
$returnToken = T_RETURN;
$tokens = token_get_all($source);
foreach ($tokens as $key => $token)
{    
    if (is_array($token))
    {
        if (($token[0] == $returnToken))
        {
            // found return, now get what is returned?
        }
        else
        {
            $token = $token[1];
        }
    }

    $newStr .= $token;
}

我不知道如何获取实际返回的代码。这就是我想要的。

有人知道我该怎么做吗?

【问题讨论】:

    标签: php token tokenize


    【解决方案1】:

    也许这可能会有所帮助。虽然我很想知道你最终想要做什么。

    $tokens = token_get_all($str);
    $returnCode = '';
    $returnCodes = array();
    foreach ($tokens as $token) {
        // If return statement start collecting code.
        if (is_array($tokens) && $token['0'] == T_RETURN) {
            $returnCode .= $token[1];
            continue;
        }
    
        // if we started collecting code keep collecting.
        if (!empty($returnCode)) {
            // if we get to a semi-colon stop collecting code
            if ($token === ';') {
                $returnCodes[] = substr($returnCode, 6);
                $returnCode = '';
            } else {            
                $returnCode .= isset($token[1]) ? $token[1] : $token;
            }
        }
    }
    

    【讨论】:

    • 谢谢,我也在考虑同样的想法。我想这是最好的方法。至少它非常适合我的目的。
    猜你喜欢
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多