PHP eval()函数

时间:2011-03-12 10:25:35

标签: php parsing eval

PHP函数eval()似乎是一个相当有趣的函数。有人可以解释为什么它在这个给定的情况下有效,在线:14

function Parse($inFrontEnd)
{       
    // Now create an array holding translation tokens with some from above
    // Load translation table into buffer
    $tableLines = file(Utilities::GetRelativePath(TTABLE_DIR).TTABLE); // Array of lines from TTable.cfg
    // Explode by whitespace
    foreach($tableLines as $aLine)
    {
        $lineParts = EXPLODE(' ', $aLine);
        $word = "/".$lineParts[0]."/";
        $definition = $lineParts[1];
        // Add key (word) => value (definition) to array
        // Eval() to return value of the const
        Main::$translateChars[$word] = eval("return $definition;"); 
    }
    // Read data from template file
    $parseArray = file($inFrontEnd); // Load FrontEnd source code into array ready for parse
    /* Perform the translation of template by the translation table defined data */
    $parseArray = preg_replace(array_keys(Main::$translateChars), array_values(Main::$translateChars), $parseArray);
    return $parseArray;
}

所以我在这里做的是从模板目录中读取模板。 templatename.php文件包含写为常量的文本标记,然后通过正则表达式转换,将标记替换为包含其名称的常量的数据,从而返回为用户打印的完全验证的网页页面查看。这允许通过允许在许多网页(模板)上重用这些令牌来使页面非常动态。

我的问题是:我在使用eval()的行中遇到了一段时间的麻烦。我正在尝试做的是填充一个数组,每个键是常量读入的名称,我所命名的,转换表(TTable.cfg),它保存每个标记的名称和常量与之相关:

标题词 CSS_INCLUDE CSS_INCLUDE
SHOW_ALL_POSTS SHOW_ALL_POSTS
...

所以使用协议[TOKEN] [CONSTANT] [CR] [LF]

数组中的键可以很好地创建,但是当键与键相关联时,值将返回null或者破坏我的代码:constant($ definition); 它抱怨它无法找到被宣布的常数。但是,当我在这一行上使用eval时,每个键与:eval(“return $ definition;”); 它可以按照我想要的方式工作 - 值作为相应常量的数据。

我为这篇文章的篇幅道歉。除了我发现的情况之外,我找不到任何其他问题的例子。

3 个答案:

答案 0 :(得分:2)

变量$definition的值将替换为字符串定义"return $definition;",因为您使用的是双引号。因此,传递给eval的内容是必不可少的:"return FOO;",其中FOO是变量$ definition的值。

现在,使用eval()评估该代码,并将结果作为评估结果返回,该值是常量FOO的值(每次迭代不同)。

在这种情况下使用constant更有意义:它更快,更安全,更易读。

if ( defined( $definition ) ) {
    $constval = constant( $definition );
}
else {
    $constval = $definition;
}

这也可以让您深入了解使用eval()时的原因,而不只是constant(); PHP使用各自的名称替换未知常量,因此eval适用于您的情况。然而,任何其他方式都会引发警告,并且是一种不好的做法,因为它无法说清楚读者会发生什么。

答案 1 :(得分:1)

请记住,eval是邪恶的,所以当你可以避免它时,不要使用它。在这里,您只需使用constant

答案 2 :(得分:0)

最微小的疏忽。我从转换表的每一行展开后忘了清除$ definition。所以一个简单的trim()解决了这个问题。

   constant($definition);

现在有效。

疯狂:D