PHP - eval()问题

时间:2011-04-30 05:45:37

标签: php

我有两个文件,如下面的

SomeClass.php

class SomeClass {
  public function display() {
    $content = file_get_contents("helloworld.php");
    eval($content);
  }

  public function helloWorld() {
    echo "hello World!";
  }

}

helloworld.php

<?php
  $this->helloWorld() ;
?>
<p>It's html expression</p>

如您所见,我尝试在display函数中执行helloworld.php。 当然,它会出现错误,因为html标签放在显示功能中。

有没有什么好方法可以在显示保存helloworld.php代码的显示函数中执行helloworld.php文本?

4 个答案:

答案 0 :(得分:2)

如果您尝试在当前代码的上下文中执行特定文件,为什么不使用includerequire

请记住,如果eval是答案,则问题是错误的。

如果确实想在这里使用eval

eval('?>' . $content);

应该有效。是的,你可以关闭并重新打开里面的PHP标签。这就是某些模板引擎的工作方式。

答案 1 :(得分:1)

您可以使用输出缓冲来捕获它。

ob_start();
include "helloworld.php";
$content = ob_get_contents();
ob_end_clean();

答案 2 :(得分:1)

除非你想进行字符串连接,否则无法做到这一点。

我通过对helloworld.php文件进行了一些小改动来测试它,因为它可以工作:

$this->helloWorld() ;
?><p>It's html expression</p>

这表明文本是原始运行的,就好像它包含在内一样。

现在,如果您不能或不能更改打开的<?php标记,则可以采用以下两种方式之一。

简单方法(String Concatenation):

public function display() {
    $content = file_get_contents("helloworld.php");
    eval('?>' . $content); //append a php close tag, so the file looks like "?><?php"
}

更难的方式(String Replace):

public function display() {
    $content = file_get_contents("helloworld.php");

    //safely check the beginning of the file, if its an open php tag, remove it.
    if('<?php' == substr($content, 0, 5)) {
        $content = substr($content, 5);
    }
    eval($content);
}

答案 3 :(得分:0)

您可以使用includerequire来实现此目的。