想象一下,我们有两个文件,一个名为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"
之前有没有人遇到过这个问题,如果有的话,你会怎么解决?
答案 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)
您是否考虑过使用require
或include
? PHP Manual
示例:
$hello = "Hello from 2";
echo $hello;
include("1.php");
echo $hello;
答案 3 :(得分:0)
尝试使用$GLOBALS['hello']
代替$hello
PS:不要忘记eval
是邪恶的;)