2011-03-29 35 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