PHP - 有没有办法将字符串“包含”为文件?

时间:2014-01-28 16:04:21

标签: php include

有一种已知的方法可以在加载时包含文件并将其内容捕获到字符串中。

$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}

http://php.net/manual/en/function.include.php

有没有办法从字符串而不是文件中“包含”内容加载

我的意思是这样的:

$string = file_get_contents("file.php");
include_from_string($string);

5 个答案:

答案 0 :(得分:3)

如果您希望将字符串解析为PHP代码,就像加载include()的文件的内容一样,那么您需要的函数是eval()

请注意,与include()加载的代码不同,eval()执行的代码会自动以PHP模式启动,因此您不需要(也不应该!)以{{1}为前缀}}。如果您想要模拟<?php 的行为,则可以将字符串作为include()加上eval()的前缀,以离开PHP模式:

?>

另请注意,$string = file_get_contents( 'somefile.php' ); eval( '?>' . $string ); 是一个非常危险的功能!虽然在这种特定情况下它不应该比eval()本身更具风险,在{em>可能甚至可能包含未经过清理(或消毒不足)的用户的任何字符串上使用include()输入 极其危险 ,攻击者可能利用它来在您的系统上执行恶意代码,从而获得对它的控制权。

答案 1 :(得分:2)

这可能不是您要找的内容,但是我得到了“ 解决方法”。

只需使用tempnam()创建一个临时文件,然后将其添加到unlink()

cmd + opt + i

这个错误:

我不确定这是否是一个好习惯(但是,该死的,很简单),因为没有人建议这样做,但是比eval()更好,后者基本上是“ 代码危险”。

这是正确的:

正如@Chris Harrison所说,这是安全隐患,它等于eval()。因此,您基本上可以这样做:

$path = "somefile.php";
$stringFile = file_get_contents($path);
$pathTmp = tempnam("tmp/", ""); // you pass directory in which you will store tmp files for me it's "tmp/"
$file = fopen($pathTmp, "w+");
fwrite($file,$widget);
fclose($file);
include $pathTmp; // include the file, and PHP will be automatically parsed
unlink($pathTmp); // delete file

答案 2 :(得分:0)

只需回显,而不是在您的功能中使用 include

<强>更新

您的功能应如下所示:

$string = "Whatever";
$str = get_var($string);
function get_var($str) {
ob_start();
echo $str;
return ob_get_clean();
}

答案 3 :(得分:0)

这是一个简单的例子,如果你传入eval(),它将执行字符串变量中的代码。

<?php 

//here your PHP Code goes
$string = get_include_contents('somefile.php');

//evaluating the string this will work
eval($string); //output

答案 4 :(得分:0)

这不等同于使用include。这是问题:eval()接受提供的PHP,并在当前环境中执行它。因此,在eval()之前定义的任何全局变量,函数,类,什么不是可用于处理器的。这一切都很好,并且在返回时,原始(evel'd)字符串剩下的唯一内容是任何echo(或等效)语句的结果。

这与包含不同。文件内容与源代码合并,并传递给eval()。非常非常不同。最简单的方法是将你的字符串定义为'class fu {static function bar(){echo“哇”;把它放在一个文件中并调用fu :: bar()然后你就会显示'哇'。在你的代码中的同一点,如果你做一个eval('class fu ...')并从你的代码调用fu :: bar()你将得到“致命错误:调用私有方法fu :: bar( )来自上下文......“

但是,只要您不需要与'include'进行交互,结果就会显得相同。