我正在创建一个站点,根据某些条件(即是否登录,是否填写表格等),不同的页面看起来会非常不同。这使得有必要在不同的时间输出不同的 html 块。
然而,这样做会使我的 php 代码看起来很可怕......它确实与代码的格式和“形状”相混淆。我应该如何解决这个问题?在我的脚本底部包含自定义“html 转储”功能?同样的事情,但包含?Heredocs(看起来不太好)?
谢谢!
我正在创建一个站点,根据某些条件(即是否登录,是否填写表格等),不同的页面看起来会非常不同。这使得有必要在不同的时间输出不同的 html 块。
然而,这样做会使我的 php 代码看起来很可怕......它确实与代码的格式和“形状”相混淆。我应该如何解决这个问题?在我的脚本底部包含自定义“html 转储”功能?同样的事情,但包含?Heredocs(看起来不太好)?
谢谢!
不要惊慌,每个新的 Web 程序员都会面临这个问题。
您必须将程序逻辑与显示分开。首先,尝试为每个网页使用两个文件来制作自己的解决方案:
然后包括您需要的地点/时间。例如:
myPageLogic.php
<?php
// pure PHP code, no HTML
$name = htmlspecialchars($_GET['name']);
$age = date('Y') - htmlspecialchars($_GET['age']);
?>
myPageView.php
// very few php code
// just enought to print variables
// and some if / else, or foreach to manage the data stream
<h1>Hello, <?php $name ?> !</h1>
<p>So your are <?php $age?>, hu ?</p>
(您可能想为此使用替代的 PHP 语法。但不要试图使其第一次完美,真的。)
我的页面.php
<?php
require('myPageLogic.php');
require('myPageView.php');
?>
暂时不要担心性能问题。这不是你作为新手的首要任务。这个解决方案并不完美,但会帮助你解决你的编程水平的问题,并会教你基础知识。
然后,一旦你对这个概念感到满意,就买一本关于 MVC 模式的书(或者寻找关于它的堆栈溢出条目)。那就是你下一次想要做的事情。然后你会尝试一些模板系统和框架,但稍后。现在,只需编码并从头开始学习。你可以完美地编写这样的项目,作为一个菜鸟,这很好。
使用 mvc 方法。
这不是你会在几个小时内得到的。你真的需要练习它。主要的是控制器将访问您的模型(数据库层),对您的数据进行处理,然后将其发送到视图进行渲染。这过于简单了,但您只需要阅读和练习即可理解它。
这是我用来帮助我学习的东西。 http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html
尽量将您的内容和布局与您的代码分开。每当您在 .php 文件中编写任何 HTML 时,停下来想一想“这真的属于这里吗?”
一种解决方案是使用模板。查看Smarty模板系统,了解一个非常易于使用的选项。
然而,这样做会使我的 php 代码看起来很可怕......它确实与代码的格式和“形状”相混淆。我应该如何解决这个问题?
将您的 PHP 和 HTML 视为一个层次结构,具有单一、一致的缩进结构。因此,诸如“if”或“for”之类的 PHP 封闭结构引入了新级别的缩进,其内容始终是一组平衡的开始和结束标记。从本质上讲,您正在使您的 PHP 在 XML 术语的意义上“格式良好”,无论您是否实际使用 XHTML。
例子:
<div class="prettybox">
Hello <?php echo(htmlspecialchars($name)) ?>!
Your food:
<?php foreach($foods as $food) { ?>
<a href="/food.php?food=<?php echo(urlencode($food)) ?>">
<?php echo(htmlspecialchars($food)) ?>
</a>
<?php } ?>
<?php if (count($foods)==0) { ?>
(no food today)
<?php } ?>
</div>
警惕围绕分离逻辑和标记的宗教教条再次出现在答案中。虽然您当然希望将业务逻辑排除在页面输出代码之外,但这并不一定意味着使用单独的文件、类、模板和框架会产生大量开销,这对于您正在做的事情确实是必要的。对于一个简单的应用程序,将动作/逻辑的东西放在文件的顶部和下面的页面输出可能就足够了。
(例如,根据上面的评论之一,执行 htmlspecialchars() 是页面输出功能,您绝对不想将其放入 PHP 的操作位中,混入所有业务逻辑中。始终保持文本为纯文本,未转义字符串,直到它离开你的应用程序逻辑。如果一直输入'echo(htmlspecialchars(...))'太罗嗦,你总是可以用一个像'h'这样的短名称来做同样的事情。 )
从您的问题的声音来看,您的代码中的逻辑和表示之间似乎没有太多分离。在设计应用程序时,这是一个非常重要的考虑因素,原因完全可以从您当前面临的情况中得到证明。
如果您还没有,我会看看一些 PHP 模板引擎,例如Smarty。
在这种情况下,我将所有内容增量写入变量或有时是数组,然后回显变量/数组。它还有一个额外的优势,即页面总是一次性呈现,而不是逐步呈现。
在这种情况下,我最终要做的是构建我包含的 HTML 数据的“模板”文件,然后使用正则表达式进行解析。它使代码保持干净,并且更容易将部分交给设计人员或其他 HTML 人员。
在Wikipedia上查看 MVC 编程实践背后的理想
你需要一个框架。这不仅会使您的代码变得漂亮(因为已经提到的模型-视图-控制器模式,MVC)- 由于已经为它编写了组件,它会节省您的时间。
我推荐 QCodo,它很棒;还有其他的——CakePHP、Symfony。
如果这是一个大项目,可能需要一个框架。如果没有,请创建一些模板文件并在页面顶部决定要包含的模板文件。
例如
if ($_SESSION['logged_in'])
include(TPL_DIR . 'main_logged_in.tpl');
else
include(tPL_DIR . 'main.tpl');
只是一个简单的例子
如上所述..您正在解决症状,而不是问题..
您需要的是逻辑和表示的分离。这可以通过某种 mvc 框架来完成。即使您不想一直使用 mvc 框架.. 模板引擎是必须的,至少如果您的逻辑足够复杂以至于您对所解释的内容有困难
我强烈建议savant而不是 smarty,
将逻辑与表示分离并不意味着您的所有业务逻辑都必须在 php 中,而您的表示逻辑必须在其他东西中,分离是一个概念性的事情,您必须将准备数据的逻辑与显示它的逻辑分开。显然,业务逻辑不必包含表示元素。
除了在模板系统(PHP 本身)之上实现模板系统,默认情况下会产生开销,您可以寻求更强大的解决方案,例如XSL Transformations,它也符合MVC 原则(前提是您将数据检索分开;另外,我个人将逻辑与显示具有不同文件的 XML 分开)。
想象一下在一个数组中有以下信息,您希望将其显示在一个表格中。
Array
{
[car] => green
[bike] => red
}
您可以轻松地创建一个以 XML 格式输出此信息的脚本:
echo "<VEHICLES>\n";
foreach(array_keys($aVehicles) as $sVehicle)
echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n";
echo "</VEHICLES>\n";
生成以下 XML:
<VEHICLES>
<VEHICLE>
<NAME>car</NAME>
<COLOR>green</COLOR>
</VEHICLE>
<VEHICLE>
<NAME>bike</NAME>
<COLOR>red</COLOR>
</VEHICLE>
</VEHICLES>
现在这一切都很好,但不会以很好的格式显示。这就是 XSLT 的用武之地。使用一些简单的代码,您可以将其转换为表格:
<xsl:template match="VEHICLES">
<TABLE>
<xsl:apply-templates select="VEHICLE">
</TABLE>
</xsl:template>
<xsl:template match="VEHICLE">
<TR>
<TD><xsl:value-of select="NAME"></TD>
<TD><xsl:value-of select="COLOR"></TD>
</TR>
</xsl:template>
瞧,你有:
<TABLE>
<TR>
<TD>car</TD>
<TD>green</TD>
</TR>
<TR>
<TD>bike</TD>
<TD>red</TD>
</TR>
</TABLE>
现在对于这个简单的例子,这有点矫枉过正;但是对于大型项目中的复杂结构,这是使您的脚本逻辑远离您的标记的绝对方法。
检查这个关于分离 PHP 和 HTML 的问题,有多种方法可以做到这一点,包括自己编写的模板系统、Smarty 等模板系统、PHP 作为自己的模板系统等等等等。
我认为你在这里有两个选择,要么使用 MVC 框架,要么使用惰性模板方式,这会给你的代码带来很大的开销。显然我支持前者,我认为学习 MVC 是本书中最好的 Web 开发技巧之一。