我是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,而不是整个块。
答案 0 :(得分: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;
VS
$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;
答案 1 :(得分: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>
并将其包含在适合的位置 - 最有可能出现在模板类中。