替换heredoc语法

时间:2011-03-29 16:34:14

标签: php html syntax heredoc

我是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 个答案:

答案 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>

并将其包含在适合的位置 - 最有可能出现在模板类中。