PHP代码动态评估

时间:2011-08-03 21:24:19

标签: php

想象一下,我们有两个文件,一个名为1.php,其代码如下:

<?php
    $hello = "Hello from 1";
?>

2.php,代码如下:

<?php
    function LoadPage( $page )
    {
        $f = fopen( $page, 'r+' );  
        $content = fread( $f, filesize($page) );
        fclose( $f );
        return $content;
    }

    function GetEvalContent( $content )
    {
        $var = "";
        ob_start();
        eval( "?>" . $content . "<?" );
        $var = ob_get_contents();
        ob_end_clean();
        return $var;
    }

    $hello = "hello from 2";

    echo $hello . '<br/>';

    $content = LoadPage( '1.php' );
    GetEvalContent( $content );

    echo $hello;
?>

那么2.php所做的是加载1.php的内容并评估其中的php代码。现在我要做的是在评估1.php期间,变量$ hello更改为“hello from 1”。但是,如果您执行2.php,则总是得到:

"hello from 2"
"hello from 2"

而不是

"hello from 2"
"hello from 1"

之前有没有人遇到过这个问题,如果有的话,你会怎么解决?

4 个答案:

答案 0 :(得分:5)

有一种更简单的方法可以做到这一点。使用PHP的include

1.PHP

<?php
   $hello = "Hello from 1";
?>

2.PHP

<?php
   $hello = "hello from 2";
   echo $hello;
   include '1.php';
   echo $hello;
?>

更新(未测试):

function includeFile($file){
  global $hello;  // Use the global variable $hello
                  // this will make the include sets $hello correctly
  ob_start();
  include $file;  // Remember any variables set here will be in this scope,
                  // not the global scope (unless you add them to the global line above)
  $var = ob_get_contents();  // This will contain anything echoed to the screen
                             // from the included file
  ob_end_clean();
  return $var;
}

$hello = "hello from 2";
echo $hello;
$file = '1.php';
$output = includeFile($file);
echo $hello;
echo $output;

答案 1 :(得分:1)

您正在函数中执行eval(),因此包含文件中的$hello将只是函数范围的一部分。它不会影响在函数外部定义的$hello(全局范围)。

您需要将global关键字放入包含的文件中,除非您想编写自己的PHP解析器以确定所包含文件中定义的变量并自动将其全局化。

然而,从更大的角度来看......为什么? eval是一个非常邪恶的丑陋构造,你正在打开一个调试痛苦的世界,更不用说安全问题了。

答案 2 :(得分:1)

您是否考虑过使用requireincludePHP Manual

示例:

$hello = "Hello from 2";
echo $hello;
include("1.php");
echo $hello;

答案 3 :(得分:0)

尝试使用$GLOBALS['hello']代替$hello

PS:不要忘记eval是邪恶的;)