2011-03-29 71 views
2

我是新來的PHP和我有一個模板系統,其中我使用heredoc語法,但因爲多種原因決定擺脫它。替換heredoc語法

我有一些看起來像這樣:

public function display_admin() { 

    return <<<ADMIN_FORM 

    <form action="{$_SERVER['PHP_SELF']}" enctype="multipart/form-data" method="post"> 
     <label for="title">Title:</label><br /> 
     <input name="title" id="title" type="text" maxlength="220" /> 
     <div class="clear"></div> 
     <label for="bodytext">Body Text:</label><br /> 
     <textarea name="bodytext" id="bodytext"></textarea> 
     <input type="submit" value="Create This Entry!" /> 
    </form> 

    ADMIN_FORM; } 

而且我把它用這個頁面上:

$obj = new myCMS(); 
echo $obj->display_admin(); 

我怎麼能代替定界符?是否有另一種有效的方法將大塊HTML插入到PHP函數中?我知道必須有一個簡單的解決方案,在這裏,但每次我谷歌它,我得到的答案似乎更適合插入單行的HTML,而不是整個塊。

回答

3

首先,將大塊HTML插入到PHP函數中的原因並不多。
調用$obj->display_admin();沒有多大意義。

$data = array('bodytext' => $text); 
$obj->set_data($data); 
$obj->set_template('admin_form') 
$obj->display(); 

做。

接下來,heredoc絕對不是一個模板解決方案。
雖然PHP本身是。

所以,使文件admin_form.tpl.php

<form action="" enctype="multipart/form-data" method="post"> 
    <label for="title">Title:</label><br /> 
    <input name="title" id="title" type="text" maxlength="220" /> 
    <div class="clear"></div> 
    <label for="bodytext">Body Text:</label><br /> 
    <textarea name="bodytext" id="bodytext"><?=$data['bodytext']?></textarea> 
<? if ($data['id']): ?> 
    <input name="id" id="id" type="hidden" value="<?=$data['id']?>" /> 
<? endif ?> 
    <input type="submit" value="Create This Entry!" /> 
</form> 

,只是包括它此時它 - 最有可能在你的模板類。

3

HEREDOCS是這類多行文本構建的唯一實際選擇。您唯一的其他選擇是逐行連接,或者從PHP模式中「休息」並使用一些輸出緩衝。

$text = "blah blah blah"; 
$text .= "blah blah blah"; 
$text .= "blah blah blah"; 

ob_start(); ?> 
blah blah blah 
blah blah blah 
blah blah blah 
<? $text = ob_get_clean(); 

$text = <<<EOL 
blah blah blah 
blah blah blah 
blah blah blah 
EOL; 

在3中,heredocs更加可用。您不必擔心在文本體內引用轉義引號,並且使用可變函數,您甚至可以在文本中執行函數調用以執行諸如htmlspecialchars()調用之類的操作,而無需在heredoc塊之外預先定義任何此類文本。

$formfield = htmlspecialchars($_POST['somefield']); 
$txt = <<<EOL 
<input type="text" value="$formfield" /> 
EOL; 

$hsc = function($x) { return htmlspecialchars($x); }; 

$txt = <<<EOL 
<input type="text" value="{$hsc($_POST['somefield'])}" /> 
EOL; 

評論隨訪:

沒有說你不能連接here文檔:

$txt = <<<EOL 
blah blah blah 
EOL; 

$txt .= <<<EOL 
more blah 
EOL; 

畢竟,一個定界符只產生一恰好有多個l的字符串它的文字。您可以將單塊單個heredoc分成兩個或更多個部分,並將您的條件if()放在兩者之間。

在另一方面,與變量的功能,你可以平凡掀起一個備份到一個定界符內插入條件文本:

$conditional = function($parameter) { return (($parameter == 1) ? 'Success' : 'Failure'); } 

$txt = <<EOL 
Your login attempt 
resulted in {$conditional($somevalue)}. 
How does that make you feel? 
EOL; 

V.S.

$txt = <<<EOL 
Your login attemp 
resulted in 
EOL; 
$txt .= (($somevalue == 1) ? 'Success' : 'Failure'); 
$txt .= <<<EOL 
. 
How does that make you feel? 
EOL; 
+0

問題是,我需要折騰一些在heredoc中間的'if'語句來報告成功發佈等等......通常如何處理?我是否以這種錯誤的方式去做? – Thomas 2011-03-29 16:49:18

+0

@托馬斯哦,太棒了。這個問題是我說heredoc不是模板選擇的確切原因! – 2011-03-29 16:57:23

+0

不要介意PHP是一種模板語言,所以當您模板另一個模板時,您是否希望模板適合您的模板?非常「入門」 - 像 - 總是更深層次的... – 2011-03-29 16:58:43