保持我的PHP漂亮

时间:2020-03-06 14:31:23  来源:igfitidea点击:

我正在创建一个站点,根据某些条件(例如,是否登录,是否填写表格等),不同的页面看起来可能会非常不同。这使得有必要在不同的时间输出不同的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'的短名称来做一个函数。 )