douduoquan2824 2011-03-12 10:25
浏览 64
已采纳

PHP eval()函数

The PHP function eval() appears to be a rather interesting function. Can someone explain why it works in this given situaton, on line: 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;
}

So what I'm doing here is reading in a template from a template directory. The templatename.php file comprises of text tokens written constant-like, which are then translated by regular expressions replacing the tokens with the data the constants with their names hold, thus returning a fully validated page of a webpage, which is printed for the user to view. This allows pages to be very dynamic by allowing the reuse of these tokens over many webpages (templates).

My question is: I had trouble for a while with the line that uses eval(). What I'm trying to do there is fill an array with each key being the name of the constant read in from, what I've named, the translation table (TTable.cfg), which holds the name of each token and the constant associated with it:

TITLE TITLE
CSS_INCLUDE CSS_INCLUDE
SHOW_ALL_POSTS SHOW_ALL_POSTS
...

So with the protocol [TOKEN] [CONSTANT][CR][LF]

The keys within the array would be created fine, but the values would return null or break my code when I had the key be associated with: constant($definition); It complained it couldn't find the constants being declared. However, when I use eval as is on this line, each key associated with: eval("return $definition;"); it works as I want it - the values as their corresponding constant's data.

I do apologise for the length of this post. I couldn't find any other example for my question other than the case I found it in.

  • 写回答

3条回答 默认 最新

  • dongtiao1817 2011-03-12 10:40
    关注

    The value of the variable $definition is replaced into the string definition "return $definition;", as you're using double quotes. Hence, what is passed to eval is essential something like this: "return FOO;", where FOO is the value of the variable $definition.

    Now, that code is evaluated using eval(), and the result is returned as the result of the evaluation, which is the value of the constant FOO (different in each iteration).

    Using the constant in this case makes more sense: It is faster, potentially securer, and more readable.

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

    This will also give you some insight of why it works when using eval() and not just constant(); PHP replaces unknown constants with their respective names, thus eval works in your case. However, any other way would raise warnings and be a bad practice, as it doesn't make clear what's going on to the reader.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题