替换heredoc语法

3
我是一名新手,正在学习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而不是整个块。

2个回答

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;

在这三种方法中,heredocs的使用性更高。你不必担心在文本主体中转义引号,而且还可以在文本内部使用变量函数,现在甚至可以进行函数调用来执行一些操作,比如在heredoc块之外预定义任何此类文本时无需进行htmlspecialchars() 调用。

$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;

对比

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

问题在于我需要在heredoc中插入一些“if”语句来报告成功发布等情况...通常如何处理?我这样做错了吗? - Thomas
@Thomas 太好了。这个问题正是我说heredoc不适合用于模板的原因! - Your Common Sense
不要在意PHP是一种模板语言这个事实,那么你想为你的模板创建一个模板,同时你又在为另一个模板创建模板吗?非常像《盗梦空间》——总是更深层次的另一个层面... - Marc B

3

首先,很少有理由在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>

只需将它包含在适当的位置 - 最可能是在您的模板类中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接