2

我是 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,而不是整个块。

4

2 回答 2

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>

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

于 2011-03-29T16:56:34.520 回答
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;

评论跟进:

没有什么说你不能连接 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;
于 2011-03-29T16:47:05.820 回答