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;”); 它可以按照我想要的方式工作 - 值作为相应常量的数据。
我为这篇文章的篇幅道歉。除了我发现的情况之外,我找不到任何其他问题的例子。
答案 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