我是php的新手,我有一个模板系统,在这个系统中,我最初使用的是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();如何替换heredoc语法?有没有其他有效的方法将大块HTML插入到PHP函数中?我知道这里肯定有一个简单的解决方案,但每次我搜索它,我得到的答案似乎更适合于插入单行HTML,而不是整个块。
发布于 2011-03-30 00:56:35
首先,在PHP函数中插入大量HTML块没有太多的理由。
调用$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>并且只在合适的地方包含它-最有可能是在您的模板类中。
发布于 2011-03-30 00:47:06
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;评论后续:
没有什么说明你不能连接heredocs:
$txt = <<<EOL
blah blah blah
EOL;
$txt .= <<<EOL
more blah
EOL;毕竟,heredoc只是生成一个恰好包含多行文本的字符串。您可以将整个单独的heredoc分成两个或多个部分,并将条件if()内容放在这两个部分之间。
另一方面,使用变量函数,您可以简单地启动一个函数,以便在单个heredoc中插入条件文本:
$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;https://stackoverflow.com/questions/5475852
复制相似问题