通常我正在开发网站并编码PHP
和HTML
这样的内容 -
while (mysqli_stmt_fetch($stmt)) {
// Create Table Body
$html .= "<tr>\n";
$html .= " <td>$title</td>\n";
$html .= " <td>$date</td>";
$html .= " <td align='center'>\n";
$html .= " <a href='#'>\n";
$html .= " <span class='view' title='View This Comment'></span>\n";
$html .= " </a>\n";
$html .= " </td>\n";
$html .= " <td class='td_catchall' align='center'>\n";
$html .= " <a href='#'>\n";
$html .= " <span class='edit' title='Edit This Comment'></span>\n";
$html .= " </a>\n";
$html .= " </td>\n";
$html .= " <td align='center'>\n";
$html .= " <a href='#'>\n";
$html .= " <span class='delete' title='Delete This Comment'></span>\n";
$html .= " </a>\n";
$html .= " </td>\n";
$html .= "</tr>\n";
}
//Create View Blog Dialog Box
$viewBlog = "<div id='dialog-view'>\n";
$viewBlog .= " <h2>$title</h2>\n";
$viewBlog .= " <p>$date</p>\n";
$viewBlog .= " <p>";
$viewBlog .= " <img src='".UPLOAD_DIR.$userName."/".$image."' />";
$viewBlog .= " $comment</p>";
$viewBlog .= "</div>\n";
但是最近我遇到了我的一位朋友,这是一个在PHP变量中保存HTML的不良做法。并且还说我需要将逻辑与表示分开。
如果确实如此,有人可以告诉我该怎么办?
任何评论都将不胜感激。 谢谢。
答案 0 :(得分:11)
我强烈推荐使用Twig或Mustache这样的模板库。但是,基础知识是将外部PHP文件用作HTML,并使用require。这是一个hacky例子:
<?php
$comments = array();
while (mysqli_stmt_fetch($stmt)) {
$comments[] = $stmt;
}
require 'comments.php';
然后在comments.php
:
<?php foreach ($comments as $comment) : ?>
<tr>
<td><?php echo $comment['title'] ?></td>
<td><?php echo $comment['date'] ?></td>
<td align='center'>
<a href='#'>
<span class='view' title='View This Comment'></span>
</a>
</td>
<td class='td_catchall' align='center'>
<a href='#'>
<span class='edit' title='Edit This Comment'></span>
</a>
</td>
<td align='center'>
<a href='#'>
<span class='delete' title='Delete This Comment'></span>
</a>
</td>
</tr>
<?php endforeach ?>
在这里,我将每个注释(或其任何可能)添加到数组中。然后,我包含一个名为comments.php
的文件。您的主文件应该主要是PHP并且应该处理任何逻辑,而comments.php
应该主要是HTML并且仅使用PHP进行表示(也就是通过数组循环并回显变量)。
您所需的文件可以访问它内联时可以访问的所有变量。
答案 1 :(得分:8)
我如何将逻辑与演示分开?
虽然它从演示逻辑分离称为业务逻辑。两层都有逻辑。这个名字说明了一切:
举个例子,它必须是这样的
$res = $stmt->get_result();
$data = array();
while ($row = mysqli_fetch_assoc($res)) {
$data[] = $row;
}
虽然我会使用一些更智能的方法从数据库中获取数据,如下所示:
$data = $db->getArr("SELECT ...");
然后重复所有数据库或其他服务交互的所有步骤。您的目标是准备好业务逻辑必须提供的所有数据。然后您的业务逻辑结束,您可以转向演示文稿。
如果你可以轻松地交换模板引擎,你可以告诉与坏人的良好分离(你不能用其他答案的方法做到这一点,请注意) - 所以,特别引擎没有'无所谓。我们来看一个最简单的 - PHP
创建一个名为tpl.php
的文件并将此代码放在那里
<table>
<?php foreach ($data as $row): extract($row); ?>
<tr>
<td><?=$title</td>
and so on
</tr>
<?php endforeach ?>
然后将此文件包含在业务逻辑文件中。或者 - 更好 - 在某些更高级别的模板中。
您可以在this topic
中看到该方法的真实例子使用这种分离,您可以:
虽然从目前的方法或其他答案的方法来看,这一切都是不可能的。这个想法是分离的事情。