如果我有这样的hello.php文件:
Hello, <?php echo $foo; ?>!
我想在一些PHP代码中做这样的事情:
$text = renderPhpToString('hello.php', array('foo'=>'World'));
并以
结束$text == 'Hello, World!'
标准PHP 5可以实现吗?显然我想要更多带有循环的复杂模板等等。
答案 0 :(得分:37)
您可以使用以下功能:
function renderPhpToString($file, $vars=null)
{
if (is_array($vars) && !empty($vars)) {
extract($vars);
}
ob_start();
include $file;
return ob_get_clean();
}
它使用输出缓冲区控制函数ob_start()
来缓冲以下输出,直到ob_get_clean()
返回。
修改确保验证传递给此函数的数据,以便$vars
没有file
元素覆盖传递的$file
论证价值。
答案 1 :(得分:3)
正如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();
}
答案 2 :(得分:2)
答案 3 :(得分:2)
关于传递$vars = array('file' => '/etc/passwd');
,您可以使用extract($vars, EXTR_SKIP);
答案 4 :(得分:1)
您可以使用output buffering执行此操作,但可能更适合使用众多模板引擎之一。