我需要在运行时将PHP文件渲染或评估为PHP字符串变量.file_get_contents()会读取内容但不会评估PHP代码.
我知道ob_start()解决方案(如此处所述:从本地PHP文件获取呈现HTML),但感觉相当脏.我希望有更直接和干净的东西.
我想要完成的例子:
test.php的
<?php
for ($i = 0; $ < 5; $i++) {
echo '<p>' . $i . '</p>\n';
}
Run Code Online (Sandbox Code Playgroud)
我的代码:
<?php
$string = render_php('test.php');
/*
Content of $string:
<p>0</p>
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
*/
Run Code Online (Sandbox Code Playgroud)
Ins*_*bia 24
正如其他人提到的那样,输出缓冲可能是最干净的解决方案,因为它允许您将html模板与逻辑分开.这样你最终会在模板文件中找到相当可读的html,而不是意大利面条代码混乱.
function render_php($path)
{
ob_start();
include($path);
$var=ob_get_contents();
ob_end_clean();
return $var;
}
Run Code Online (Sandbox Code Playgroud)
然后创建模板文件
//test.php
<?php for($i = 0; $i<5; $i++):?>
<p><?php echo $i;?></p>
<?php endfor ?>
Run Code Online (Sandbox Code Playgroud)
然后调用你的函数:
render_php('test.php');
Run Code Online (Sandbox Code Playgroud)
您甚至可以通过添加第二个参数(数组或对象,即
function render_php($path,array $args){
ob_start();
include($path);
$var=ob_get_contents();
ob_end_clean();
return $var;
}
Run Code Online (Sandbox Code Playgroud)
现在让我们看看它是如何有用的
//create your template test.php
<?php for($i = $args['start']; $i<$args['end']; $i++):?>
<p><?php echo $i;?></p>
<?php endfor ?>
Run Code Online (Sandbox Code Playgroud)
现在创建您的参数并将它们传递给render方法
$args = array('start' => 0, 'end' => 5);
render_php('test.php', $args);
Run Code Online (Sandbox Code Playgroud)
为什么这很有用
现在你有一个有用的可重用函数,无论你需要传递多少个参数,你的逻辑可以放在显示器的单独文件中,使你的代码更具可读性.我们可以使用它来构建仍然易于阅读的大块html.
即
$article = array( //imagine we have an article that we have pulled from our database
'title' => 'Some Title',
'subtitle' => 'Some Sub Title',
'body' => 'lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris
eu nulla quis ligula ornare ultricies. Vivamus malesuada lectus a mi
auctor pellentesque. Maecenas eu ultricies sapien, ac porta augue. ',
'image' => 'img/some_image.jpg'
);
echo render_php('article.php',array $article);
Run Code Online (Sandbox Code Playgroud)
并创建一个模板
<!-- article.php -->
<!DOCTYPE html>
<html>
<head>
<title><?php echo $article['title']; ?></title>
</head>
<body>
<img src='<?php echo $article['image']; ?>' alt='whatever' >
<h1><?php echo $article['title']; ?></h1>
<h2><?php echo $article['subtitle']; ?></h2>
<p><?php echo $article['body'];?></p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)