首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换heredoc语法

替换heredoc语法
EN

Stack Overflow用户
提问于 2011-03-30 00:34:14
回答 2查看 1.8K关注 0票数 2

我是php的新手,我有一个模板系统,在这个系统中,我最初使用的是heredoc语法,但后来由于一些原因决定放弃它。

我有一个类似这样的东西:

代码语言:javascript
复制
    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; }

我在一个页面上调用它,使用下面的代码:

代码语言:javascript
复制
$obj = new myCMS();
echo $obj->display_admin();

如何替换heredoc语法?有没有其他有效的方法将大块HTML插入到PHP函数中?我知道这里肯定有一个简单的解决方案,但每次我搜索它,我得到的答案似乎更适合于插入单行HTML,而不是整个块。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-30 00:56:35

首先,在PHP函数中插入大量HTML块没有太多的理由。

调用$obj->display_admin();没有多大意义。

代码语言:javascript
复制
$data = array('bodytext' => $text);
$obj->set_data($data);
$obj->set_template('admin_form')
$obj->display();

制造。

接下来,heredoc绝对不是一个模板解决方案。

而PHP本身就是。

因此,创建一个文件admin_form.tpl.php

代码语言:javascript
复制
<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>

并且只在合适的地方包含它-最有可能是在您的模板类中。

票数 3
EN

Stack Overflow用户

发布于 2011-03-30 00:47:06

HEREDOCS是这种类型的多行文本构建的唯一实用选择。您唯一的其他选择是逐行连接,或者“中断”PHP模式并使用一些输出缓冲。

代码语言:javascript
复制
$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块之外预定义任何此类文本。

代码语言:javascript
复制
$formfield = htmlspecialchars($_POST['somefield']);
$txt = <<<EOL
<input type="text" value="$formfield" />
EOL;

代码语言:javascript
复制
$hsc = function($x) { return htmlspecialchars($x); };

$txt = <<<EOL
<input type="text" value="{$hsc($_POST['somefield'])}" />
EOL;

评论后续:

没有什么说明你不能连接heredocs:

代码语言:javascript
复制
$txt = <<<EOL
blah blah blah
EOL;

$txt .= <<<EOL
more blah
EOL;

毕竟,heredoc只是生成一个恰好包含多行文本的字符串。您可以将整个单独的heredoc分成两个或多个部分,并将条件if()内容放在这两个部分之间。

另一方面,使用变量函数,您可以简单地启动一个函数,以便在单个heredoc中插入条件文本:

代码语言:javascript
复制
$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.

代码语言:javascript
复制
$txt = <<<EOL
Your login attemp
resulted in
EOL;
$txt .= (($somevalue == 1) ? 'Success' : 'Failure');
$txt .= <<<EOL
.
How does that make you feel?
EOL;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5475852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档