【问题标题】:PHP: Whole HTML page as variable - is there a better way?PHP:整个 HTML 页面作为变量 - 有没有更好的方法?
【发布时间】:2010-11-04 12:47:21
【问题描述】:

我有一个很大的表单,在表单的末尾会向用户显示一个摘要:

You have entered:
<table>
    <tr>
        <td>First name</td>
        <td><?php echo $firstname ?></td>
    </tr>
    <tr>
        <td>Last name</td>
        <td><?php echo $lastname ?></td>
    </tr>
</table>

我首先设计了摘要页面,现在我想到最好将此页面作为确认电子邮件发送给用户。我现在做的是这样的:

<?php $summarypage = "<table>
        <tr>
            <td>First name</td>
            <td>".$firstname."</td>
        </tr>
        <tr>
            <td>Last name</td>
            <td>".$lastname."</td>
        </tr>
    </table>";
echo $summarypage; ?>

对于循环,我在循环中使用$summarypage .= "blabla";

发送电子邮件时,我可以将$summarypage 附加到我的电子邮件正文中。漂亮。

我在做什么好吗?对我来说,这似乎很“不优雅”。
当我在电子邮件中再次调用 $summarypage 时,它不会被完全重新渲染 - 这意味着与它连接的所有变量(例如 $firstname)将再次被调用 - 性能猪?

是否有某种“缓冲区”我可以将$summarypage 变量写入其中,所以之后我有一个纯文本变量? $newsummarypage = string($summarypage) 会成功吗?

【问题讨论】:

    标签: php html variables concatenation


    【解决方案1】:

    忽略该级别的性能,这无关紧要。如果您展示的方法适合您,请使用它。

    使事情更具可读性的替代方法(因为您不需要 PHP 开启器/关闭器)是HEREDOC

    <?php $summarypage = <<<EOT
    <table>
     <tr>
      <td>First name</td>
      <td>$firstname</td>
      </tr>
      <tr>
       <td>Last name</td>
       <td>$lastname</td>
      </tr>
    </table>
    EOT;
    ?>
    

    【讨论】:

    • 我知道 herodoc 时,它似乎根本没有被打印出来。
    • @moontear 嗯? HEREDOC 应该替换变量。你确定$firstname 被定义了吗?
    • 我将heredoc 排除在我的答案之外,但我同意@Pekka - 这是一种更简单的方法来处理分配带有其他变量的大字符串。查看heredoc的手册页,它有自己的细微差别。 php.net/manual/en/…
    • 是的,我敢肯定,但也许我对 HERODOC 的玩得还不够(我很喜欢这个概念)。我应该在 $firstname 或 ` 吗?
    • 只需 $firstname。没有 PHP 命令进入 heredoc 块内。
    【解决方案2】:

    我认为您对字符串/变量在 php 中的工作方式有些困惑。一个小例子可能会有所帮助

    $s = "hello"; //stores the sequence 'h' 'e' 'l' 'l' 'o' in $s
    $s = $s." world";//take the sequence stored in $s add the sequence ' world', 
                     //and store in $s again
    echo $s; // prints 'hello world'. That is what $s contains, what $s is
    
    $summary = "<div>".$firstname."</div>"; // take '<div>', lookup what $firstname
                     //contains and add that, then add '</div>' and then store this 
                     //new string thing('<div>Ishtar</div>') in $summary.
    
    echo $summary; //$summary here knows nothing about $firstname, 
                   //does not depend on it
    

    所有变量都会在您使用它们时进行评估。 (嗯,大多数时候你使用变量通过评估它们。)

    【讨论】:

    • 我是个困惑的家伙。谢谢,这解释了很多!
    • @moontear - 不客气!哦,有点免责声明:请注意,这是一个简单的观点,从技术上讲,这不是 100% 正确的。嗯,还有很多东西要学:)
    • 一如既往...我在某处读到使用“。” for 连接比执行 "," 慢 - 但我想这仅适用于 echo,它需要多个参数。
    • @moontear - 更慢?你意识到你在这里谈论的是秒吗?说真的,我不在乎,你也不应该。编写有效的代码已经够难了……
    【解决方案3】:

    $summarypage 是一个字符串,所以它只是分配给一个变量的一些数据 - 如你所说的纯文本变量。将数据分配给 $summarypage 后,工作就完成了。您可以愉快地将其写入页面、电子邮件、数据库和文本文件,而不会对 $summarypage 产生额外的性能影响。

    【讨论】:

    • 所以,当我在页面上执行一次echo $summarypage 时(summarypage 中的所有变量都被迭代),然后之后我执行mail($to, $summarypage),所以 summarypage 和所有变量都需要再次评估,即使它们自上次回显以来没有改变 - 或者完整变量(所有“内部变量”评估)只是保存在内存中? (那太好了)
    • 评估的字符串是存储在内存中的。如果将文本分配给字符串,则仅在那时评估该字符串。再次使用该字符串只会调用您存储在其中的数据。不进行进一步评估。这就像一个数值 - 将 1 + 1 分配给一个变量,PHP 存储 2,而不是等式 1 + 1。将“我的名字是 $myName”分配给一个字符串,然后存储“我的名字是超现实梦想”。跨度>
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多