保持我的PHP漂亮
我正在创建一个站点,根据某些条件(例如,是否登录,是否填写表格等),不同的页面看起来可能会非常不同。这使得有必要在不同的时间输出不同的html块。
但是,这样做会使我的php代码看起来很恐怖...确实使代码的格式和"形状"混乱。我应该如何解决?在脚本底部包括自定义" html dump"功能吗?同样的东西,但包括吗? Heredocs(看起来不太好)?
谢谢!
解决方案
在这种情况下,我将所有内容逐步写入变量或者有时写入数组,然后回显该变量/数组。它还有一个优点,就是页面总是一次性显示,而不是逐步显示。
在这种情况下,我最终要做的是构建要包含的HTML数据的"模板"文件,然后使用正则表达式进行解析。它使代码保持整洁,并使向设计人员或者其他HTML人员分发代码变得更加容易。
在Wikipedia上查看MVC编程实践背后的理想选择
使用MVC方法。
http://www.phpmvc.net/
这不是我们几个小时后就会学到的东西。我们真的需要练习。最主要的是,控制器将访问模型(db层),对数据进行填充,然后将其发送到视图以进行渲染。这被简化了,但是我们只需要阅读和实践它就可以理解它。
这是我用来帮助我学习的东西。
http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html
从问题的声音来看,似乎代码中的逻辑和表示之间可能并没有太大的分离。在设计应用程序时,这是一个非常重要的考虑因素,基于我们当前所面临的情况正好说明了这些原因。
如果我们还没有,我将看看一些PHP模板引擎,例如Smarty。
尽量将内容和布局与代码分开。每当我们在.php文件中编写任何HTML时,都请停下来想一想"这真的属于这里吗?"
一种解决方案是使用模板。查看Smarty模板系统,它提供了一个非常易于使用的选项。
我们需要一个框架。这不仅会使代码漂亮(由于已经提到的model-view-controller模式,MVC),而且由于已经为它编写了组件,因此可以节省时间。
我推荐QCodo,这很棒。还有其他CakePHP,Symfony。
如果这是一个大项目,那么框架可能会井然有序。如果不是,请创建一些模板文件,然后在页面顶部确定要包含的模板文件。
例如
if ($_SESSION['logged_in']) include(TPL_DIR . 'main_logged_in.tpl'); else include(tPL_DIR . 'main.tpl');
只是一个简单的例子
如上所述。.我们正在解决症状,而不是问题..
我们需要的是逻辑和表示的分离。这可以通过某种mvc框架来完成。即使我们不想一路使用mvc框架,也必须使用模板引擎。至少在逻辑过于复杂以至于无法解释时,还是必须使用模板引擎。
不要惊慌,每个新的Web程序员都面临这个问题。
我们必须将程序逻辑与显示器分开。首先,尝试为每个网页使用两个文件来制作自己的解决方案:
- 一个只用PHP代码(没有HTML)填充变量的代码
- 另一个带有HTML和很少的PHP的:这是页面设计
然后在需要的地方注明。例如:
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语法。但是,确实不要试图在第一次就使它完美)。
myPage.php
<?php require('myPageLogic.php'); require('myPageView.php'); ?>
现在就不用担心性能问题。作为新手,这不是优先事项。该解决方案并不完美,但是可以解决编程级别的问题,并可以教我们一些基础知识。
然后,一旦我们对这个概念感到满意,就买一本有关MVC模式的书(或者查找有关它的堆栈溢出条目)。那就是你想做的下一次。然后,我们将尝试一些模板系统和框架,但是稍后。现在,只需编写代码并从头开始学习即可。作为菜鸟,我们可以完美地编写一个这样的项目,这很好。
我强烈建议使用Savant而不是聪明的人,
- 我们不必学习新的模板"语言"即可创建模板,savant模板是用php编写的
- 如果我们不想使用php,则可以使用编译器定义自己的模板"语言"
- 它很容易通过我们自己的php对象扩展
将逻辑与表示法分离并不意味着我们所有的业务逻辑都必须在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>
现在,对于这个简单的示例,这有点矫kill过正。但是对于大型项目中的复杂结构,这是使脚本逻辑远离标记的绝对方法。
检查有关分离PHP和HTML的问题,有多种方法可以做到,包括自写模板系统,Smarty等模板系统,PHP作为模板系统本身等,等等。
我认为我们在这里有两个选择,或者使用MVC框架,或者使用懒惰的模板方式,这将给代码带来可观的开销。显然,我支持前者,我认为学习MVC是本书中最好的Web开发技巧之一。
Doing that, however, makes my php code look horrific... it really messes with the formatting and "shape" of the code. How should I get around this?
将PHP和HTML视为具有单个一致的缩进结构的单个层次结构。因此,诸如" if"或者" for"之类的PHP封闭结构引入了新的缩进级别,其内容始终是平衡的开始和结束标记集。本质上,无论我们是否实际使用XHTML,我们都在用XML的术语来使PHP"格式正确"。
例子:
<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(...))'太罗word了,我们总是可以使用一个类似'h'的短名称来做一个函数。 )