2016-01-04 62 views
4

我需要在運行時將PHP文件渲染或評估爲PHP字符串變量。 file_get_contents()會讀取內容,但不會評估PHP代碼。將PHP文件渲染爲字符串變量

我知道ob_start()解決方案(如此處所述:Get render HTML from local PHP file),但它感覺很髒。我希望有更直接和乾淨的事情。

什麼我要完成

例子:

test.php的

<?php 

for ($i = 0; $ < 5; $i++) { 
    echo '<p>' . $i . '</p>\n'; 
} 

我的代碼:

<?php 

$string = render_php('test.php'); 

/* 
    Content of $string: 
    <p>0</p> 
    <p>1</p> 
    <p>2</p> 
    <p>3</p> 
    <p>4</p> 
*/ 
+1

看看http://php.net/manual/en/function.eval.php。例如我想你想要'$ string = eval(file_get_contents('test.php'));'你需要取出'<?php'並更正'$ <5'。 – chris85

+9

「我知道ob_start()解決方案,但它感覺很髒」爲什麼?據我所見,這就是你想要的? – PeeHaa

+2

在這種情況下,@Peehaa是對的 - 你有你的解決方案,並且它有一個存在於php中的理由 - 供你使用它。 – somethinghere

回答

13

正如其他人所提到的輸出緩衝可能是乾淨的解決方案在這裏,因爲它可以讓你的HTML模板遠離你的邏輯中分離出來。這樣你最終會在模板文件中獲得相當可讀的html,而不是意大利麪條代碼混亂。通過添加第二個參數(數組或對象,即

render_php('test.php'); 

你甚至可以讓這個更可重複使用:

function render_php($path) 
{ 
    ob_start(); 
    include($path); 
    $var=ob_get_contents(); 
    ob_end_clean(); 
    return $var; 
} 

然後創建模板文件

//test.php 
<?php for($i = 0; $i<5; $i++):?> 
    <p><?php echo $i;?></p> 
<?php endfor ?> 

然後調用你的函數

function render_php($path,array $args){ 
    ob_start(); 
    include($path); 
    $var=ob_get_contents(); 
    ob_end_clean(); 
    return $var; 
} 

現在讓我們看看這是怎麼有用

//create your template test.php 
<?php for($i = $args['start']; $i<$args['end']; $i++):?> 
    <p><?php echo $i;?></p> 
<?php endfor ?> 

現在創建你的論點,並通過他們關閉的渲染方法

$args = array('start' => 0, 'end' => 5); 
render_php('test.php', $args); 

爲什麼這是有用的

現在你有一個可重複使用的功能這是非常有用的,不管你需要傳遞多少個參數,並且你的邏輯可以在你的顯示器的獨立文件中,使你的代碼更具可讀性。我們可以使用它來構建仍然易於閱讀的大塊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); 

,並創建一個模板

<!-- 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> 
-1

對於示例一個簡單的實現你想要的結果可能是途徑;

test.php的

<?php 

function render_html(){ 
    $string = ''; 
    for ($i = 0; $i < 5; $i++) { 
     $string .= '<p>' . $i . "</p>\n"; 
    } 
    return $string; 
} 

代碼:

<?php 

include "test.php"; 
$string = render_html(); 

echo $string; 
+0

這不起作用,因爲包含的輸出沒有被緩衝到一個字符串中,所以它不能完成它在罐子上所說的內容,並且不能解決問題。 – somethinghere

+0

原始問題只提到不想使用php緩衝區函數。雖然我同意評論說沒有理由避免使用它們。我試圖提供一個不使用它們的簡單例子;正如問題所問。 (我從我的代碼中的原始問題中複製了一個錯字,現在已更正,並且還在雙引號中添加了換行符。) – dading84

+0

_But它不能解決問題_。我還想補充說,這不是一個給出一些限制的答案,它給出了最好的答案來解決問題 - 在這種情況下,這就是'ob'。在給定的約束條件下,「ob」是最好的解決方案。 – somethinghere