Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以将PHP文件呈现为变量吗?_Php - Fatal编程技术网

可以将PHP文件呈现为变量吗?

可以将PHP文件呈现为变量吗?,php,Php,如果我有这样一个hello.php文件: Hello, <?php echo $foo; ?>! function renderPhpToString($file, $vars=null) { if (is_array($vars) && !empty($vars)) { extract($vars); } ob_start(); include $file; return ob_get_clean(); }

如果我有这样一个hello.php文件:

Hello, <?php echo $foo; ?>!
function renderPhpToString($file, $vars=null)
{
    if (is_array($vars) && !empty($vars)) {
        extract($vars);
    }
    ob_start();
    include $file;
    return ob_get_clean();
}
结果是

$text == 'Hello, World!'
标准PHP5是否可以实现这一点?很明显,我想要更复杂的带循环的模板等等


输出缓冲可能是开始的地方。

您可以使用以下功能:

Hello, <?php echo $foo; ?>!
function renderPhpToString($file, $vars=null)
{
    if (is_array($vars) && !empty($vars)) {
        extract($vars);
    }
    ob_start();
    include $file;
    return ob_get_clean();
}
它使用输出缓冲控制功能缓冲以下输出,直到它由
ob\u get\u clean()
返回


编辑确保验证传递给此函数的数据,以便
$vars
没有覆盖传递的
$file
参数值的
文件
元素。

您可以使用,但是使用众多模板引擎中的一个可能会更好。

正如Gumbo所说,您必须检查$file变量,这是一个已经困扰我的微妙错误。我会使用func_get_arg(I)并且根本没有变量,还有一件小事,我会使用require

function renderPhpToString( )
{
    if( is_array( func_get_arg(1) ) ) {
        extract( func_get_arg(1) );
    }
    ob_start();
    require func_get_arg( 0 );
    return ob_get_clean();

}

关于传递
$vars=array('file'=>'/etc/passwd')
,您可以使用
提取($vars,EXTR\u SKIP)

最好不要有人发送$vars=array('file'=>')这正是我要找的。在我的例子中,没有必要担心用户输入。谢谢!>>在我的例子中,没有必要担心用户输入。您不仅担心这里的用户输入;未来的开发人员可以使用$vars=array('file'=>')调用函数,然后花相当长的时间对此进行解释。@rmbarnes:这有点太偏执了。如果未来的开发人员是一个白痴,那么他可以花世界上所有的时间来纠正自己的错误。:)另一方面,只需编写<代码> $file <代码>无害的东西,如<代码> $Butgs<代码>,而不必担心验证输入。为什么不做<代码> $VARs= []/Cord>?如果你认为你可能需要<代码> ExpSkip ,你应该考虑是否没有更好的解决方案。