【问题标题】:Replace heredoc syntax替换heredoc语法
【发布时间】:2011-07-25 10:54:13
【问题描述】:

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

【问题讨论】:

    标签: php html syntax heredoc


    【解决方案1】:

    首先,将大块 HTML 插入 PHP 函数的原因并不多。
    打电话给$obj-&gt;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>
    

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

    【讨论】:

      【解决方案2】:

      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;
      

      v.s.

      $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 哦,太好了。这个问题正是我说heredoc不是模板选择的确切原因!
      • 别在意 PHP 是一种模板语言这一事实​​,所以您想在模板另一个模板的同时为您的模板提供一个模板吗?非常类似于“盗梦空间”——总是更深层次......
      猜你喜欢
      • 2020-06-11
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      • 2013-11-01
      • 2016-10-28
      • 2016-08-14
      相关资源
      最近更新 更多