2014-10-02 72 views
0

我正在使用(或至少綁定到)PHP HEREDOC函數作爲模板引擎。我已經實現了可以直接處理HEREDOC中的外部函數的外部調用者字符串,並且可以成功運行。奇怪的HEREDOC輸出順序

我現在面臨的問題是,無論特定HEREDOC中的其他功能和/或代碼如何,某些功能的順序似乎優先並首先執行。

如何解決這個問題?

請注意,我是一個PHP初學者我已經做了功課,但找不到感謝解答。。。)

功能。處理器:

function heredoc($input) 
    { 
    return $input; 
    } 
    $heredoc = "heredoc"; 

HEREDOC模板:

function splicemaster_return_full_page() 
    { 
    global $heredoc; 
    $title ="This is document title"; 
    echo <<<HEREDOC 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
{$heredoc(splice_html_title($title))} 
</head> 
<body> 
{$heredoc(splicemaster_return_message())} 
{$heredoc(splice_quick_add_article_form())} 
{$heredoc(display_all_articles_in_a_html_table())} 
</body> 
</html> 
HEREDOC; 
    } 

眼下的問題是「{$定界符(display_all_articles_in_a_html_table())}「調用,它會在其他所有內容之前輸出,從而導致HTML損壞。

任何幫助表示讚賞,我已經用了很長一段時間了。

UPDATE:

使用的東西張貼在評論我試圖去做別的事情,但是這是醜陋的地獄,我會在以後的日子編輯這個問題。

function testout() 
    { 
    $title = "This is document title"; 

echo "<!DOCTYPE html>"; 
echo '<html lang="en">'; 
echo  "<head>"; 
echo  '<meta charset="utf-8">'; 
echo   "<title>". $title . "</title>"; 
echo  "</head>"; 
echo  "<body>"; 
echo splicemaster_return_message(); 
echo splice_quick_add_article_form(); 
echo display_all_articles_in_a_html_table(); 
echo  "</body>"; 
echo "</html>"; 

    } 

(它看起來的樣子並不重要 - 我有一個HTML處理器功能。)

更新2

好了,我發現「髒」的修復,壽,不解釋發動機爲何如此運作。 (我也在另一臺機器上測試,用diff。php):

function splicemaster_return_full_page() 
    { 
    global $heredoc; 
    $title ="This is document title"; 

    echo <<<HEREDOC 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
<meta charset="utf-8"> 
{$heredoc(splice_html_title($title))} 
</head> 
<body> 
{$heredoc(splicemaster_return_message())} 
{$heredoc(splice_quick_add_article_form())} 
HEREDOC; 
    echo <<<HEREDOC 
{$heredoc(display_all_articles_in_a_html_table())} 
</body> 
</html> 
HEREDOC; 
    } 
+0

我建議不要使用HEREDOC模板化整個頁面,要誠實..使用OB和加載模板...說實話,爲什麼不考慮使用框架來編程,因爲所有這些問題都已經解決了。 – 2014-10-02 17:03:52

+0

謝謝你的回覆。什麼是「OB」?除此之外,框架不是我的東西,至少不是這個項目。 (是的,你可以在HEREDOC中調用函數,你只需要將函數重命名爲一個字符串。) – mrmut 2014-10-02 17:15:46

回答

0

我在問其他網站時詢問這個(類似)的問題,同時尋找爲什麼發生這種情況,並找到了罪魁禍首。

問題出在回調(或打印)輸出的調用函數上,而不是返回它。當我切換到返回時,代碼輸出適當。

0

你不應該在這裏使用heredoc。或者真的試圖在一個函數中呈現整個html文檔。這是如何使用PHP呈現html。 注意:我也很肯定你不能在heredoc語句中調用函數。

<?php $title = "This is document title"; ?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <?php echo splice_html_title($title); ?> 
    </head> 
    <body> 
     <?php 
      echo splicemaster_return_message() 
       . splice_quick_add_article_form() 
       . display_all_articles_in_a_html_table(); 
     ?> 
    </body> 
</html> 

您可以看到這有多清潔,這使得在需要時更容易編輯。例如,您只需將其放在文件「page.php」中即可。

include_once('page.php'); 

,包括它在任何你會調用該函數splicemaster_return_full_page。

+0

我試圖構建「html代碼片斷」,當我的流程控制處理請求/頁面時,我將輸出它。我正在構建一個小文件的CMS。現在,這個工作,但突破點似乎是如何輸出的東西。我想我可以選擇調用外部文件,但我希望我可以這樣做。 - 我認爲,以你建議的方式工作會打破我的PHP,因爲頁面不是線性處理的,而是作爲一個程序。 (我會試試這個,不知道它會不會起作用。) – mrmut 2014-10-02 17:12:00

+0

好的,所以我確實嘗試過。 - 我不喜歡這種不斷進出的程序。使代碼難以管理! :-(另一件事是,連接的回聲輸出LAST函數FIRST ?? - 它只有在我輸出回聲時才起作用echo(每個函數調用的回聲) – mrmut 2014-10-02 17:21:46

+0

我不認爲首先回顯最後一個函數是可能的。 – 2014-10-02 17:23:10