【问题标题】:Keeping my PHP pretty保持我的 PHP 漂亮
【发布时间】:2010-09-11 21:38:21
【问题描述】:

我正在创建一个网站,根据某些条件(即是否登录、是否填写表格等),不同的页面看起来可能会非常不同。这使得需要在不同的时间输出不同的 html 块。

但是,这样做会使我的 php 代码看起来很糟糕……它确实与代码的格式和“形状”相混淆。我应该如何解决这个问题?在我的脚本底部包含自定义“html 转储”功能?同样的事情,但包含? Heredocs(看起来不太好)?

谢谢!

【问题讨论】:

    标签: php html formatting


    【解决方案1】:

    不要惊慌,每个新的 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>
    

    (你可能想使用alternative PHP syntax 来做这个。但不要试图让它第一次就完美,真的。)

    myPage.php

    <?php
    
    require('myPageLogic.php');
    require('myPageView.php');
    ?>
    

    暂时不要担心性能问题。这不是你作为新手的首要任务。这个解决方案并不完美,但会帮助你解决你的编程水平的问题,并且会教你基础知识。

    然后,一旦您对这个概念感到满意,就买一本关于 MVC 模式的书(或查找有关它的堆栈溢出条目)。那你想在 NEXT TIME 做些什么。然后你会尝试一些模板系统和框架,但是稍后。现在,只需编码并从头开始学习。像这样的项目,你可以完美编码,作为菜鸟,没问题。

    【讨论】:

    • 这就是我现在所做的。在脚本中处理数据,包括适当的“视图”脚本。在视图脚本中,我只在 HTML 中回显变量,并在必要时使用 if-else,循环。
    • 是的,有时我很遗憾在我最初的几年里没有人告诉我。人们应该让菜鸟做点什么,而不是要求他们为他们接触到的每一项新技术创造一个完美的开端。
    【解决方案2】:

    使用 mvc 方法。

    http://www.phpmvc.net/

    这不是您在几个小时内就能掌握的东西。你真的需要练习它。主要的是控制器将访问您的模型(数据库层),对您的数据进行处理,然后将其发送到视图进行渲染。这过于简单了,但您只需要阅读和练习即可理解它。

    这是我用来帮助我学习的东西。 http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

    【讨论】:

      【解决方案3】:

      尽量将内容和布局与代码分开。每当您在 .php 文件中编写任何 HTML 时,停下来想一想“这真的属于这里吗?”

      一种解决方案是使用模板。查看Smarty 模板系统,了解一个非常易于使用的选项。

      【讨论】:

      • 任何模板引擎都可以解决这个问题,而无需 MVC 框架的开销。 Smarty 是最佳选择。
      • 在另一个模板系统(PHP 本身)之上的模板系统(Smarty)原则上是开销。我完全赞成使用 XSL 转换等技术 (w3schools.com/xsl) Twan
      • 伙计,说真的... XSLT 太复杂了,OP 所说的绝对不需要。对于初学者,您首先需要一些 XML 来进行转换。
      【解决方案4】:

      但是,这样做会使我的 php 代码看起来很糟糕……它确实与代码的格式和“形状”相混淆。我应该如何解决这个问题?

      将您的 PHP 和 HTML 视为单一层次结构,具有单一、一致的缩进结构。因此,诸如“if”或“for”之类的 PHP 封闭结构引入了新的缩进级别,其内容始终是一组平衡的开始和结束标记。从本质上讲,无论您是否实际使用 XHTML,您都在使您的 PHP 在 XML 的意义上“格式良好”。

      例子:

      <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>
      

      警惕围绕分离逻辑和标记的宗教教条再次出现在答案中。虽然您当然希望将业务逻辑排除在页面输出代码之外,但这并不一定意味着使用单独的文件、类、模板和框架会产生大量开销,这对于您正在做的事情确实是必要的。对于一个简单的应用程序,将操作/逻辑的内容放在文件的顶部和下面的页面输出可能就足够了。

      (例如,从上面的其中一个 cmets 中,执行 htmlspecialchars() 是您绝对想要放入 PHP 的操作位的页面输出功能,在所有业务逻辑。始终将文本保持为纯文本,未转义的字符串,直到它离开您的应用程序逻辑。如果一直输入'echo(htmlspecialchars(...))'太罗嗦,您总是可以使用简短的函数像 'h' 这样的名字也是一样的。)

      【讨论】:

      • 这是在模板/视图中使用urlencodehtmlspecialchars 的有趣方式。这真的是比依靠控制器/框架视图对象来转义字符并将数据传递到视图以进行回显更好的方法吗?我个人使用后者。控制器负责获取和操作数据。这不是意见的责任。它只是回显数据,而不是对其进行操作。
      • 框架(更不用说控制器)如何知道转义输出视图阶段需要做什么?它可能不仅包括 HTML 转义,还包括将值模板化到 URL(urlencode/rawurlencode 取决于哪个位),或 JavaScript 字符串文字(json_encode),或 CSS 字符串文字,或可粘贴的 HTML sn -p (双 HTML 编码),或者它可能将内容吐出到纯文本电子邮件中(无编码)。如果控制器将所有内容预编码为 HTML,则无法正常工作。转义上下文绝对是视图的核心问题。
      【解决方案5】:

      从您的问题的声音来看,您的代码中的逻辑和表示之间似乎没有太多分离。在设计应用程序时,这是一个非常重要的考虑因素,原因可以从您当前面临的情况中得到确切说明。

      如果您还没有,我会看看一些 PHP 模板引擎,例如 Smarty

      【讨论】:

        【解决方案6】:

        在这种情况下,我将所有内容增量写入变量或数组,然后回显变量/数组。它的另一个优点是页面总是一次性渲染,而不是逐步渲染。

        【讨论】:

          【解决方案7】:

          在这种情况下,我最终要做的是构建我包含的 HTML 数据的“模板”文件,然后使用正则表达式进行解析。它使代码保持干净,并且更容易将代码交给设计人员或其他 HTML 人员。

          Wikipedia查看 MVC 编程实践背后的理想

          【讨论】:

            【解决方案8】:

            你需要一个框架。这不仅会使您的代码漂亮(因为已经提到的模型-视图-控制器模式,MVC) - 由于已经为它编写了组件,它会节省您的时间。

            我推荐 QCodo,它很棒;还有其他的 - CakePHP、Symfony。

            【讨论】:

              【解决方案9】:

              如果这是一个大项目,可能需要一个框架。如果没有,请创建一些模板文件并在页面顶部决定要包含哪个模板文件。

              例如

              if ($_SESSION['logged_in'])
                   include(TPL_DIR . 'main_logged_in.tpl'); 
              else
                   include(tPL_DIR . 'main.tpl');
              

              只是一个简单的例子

              【讨论】:

                【解决方案10】:

                如上所述..您正在解决症状,而不是问题..

                您需要的是逻辑和表示的分离。这可以通过某种 mvc 框架来完成。即使您不想一直使用 mvc 框架。模板引擎是必须的,至少如果您的逻辑足够复杂以至于您对所解释的内容有困难

                【讨论】:

                  【解决方案11】:

                  我强烈建议savant 而不是smarty,

                  • 您不必为了创建模板而学习新的模板“语言”,专家模板是用 php 编写的
                  • 如果您不想使用 php,您可以使用编译器定义自己的模板“语言”
                  • 它可以通过您自己的 php 对象轻松扩展

                  将逻辑与表示分离并不意味着您的所有业务逻辑都必须在 php 中,而您的表示逻辑必须在其他东西中,分离是一个概念性的事情,您必须将准备数据的逻辑与显示它的逻辑分开.显然,业务逻辑不必包含表示元素。

                  【讨论】:

                    【解决方案12】:

                    不是在模板系统(PHP 本身)之上实现模板系统,默认情况下会产生开销,您可以选择更强大的解决方案,例如 XSL Transformations,它也符合 MVC princples(前提是您单独您的数据检索;另外,我个人将逻辑与显示具有不同文件的 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>
                    

                    现在对于这个简单的例子,这有点矫枉过正;但是对于大型项目中的复杂结构,这是让您的脚本逻辑远离您的标记的绝对方法。

                    【讨论】:

                    • 在创建带有字符串连接的 xml/html 时使用 htmlspecialchars。
                    • 你是绝对正确的。 CDATA 标签也总是很好。但我忽略了这些,因为它们只会混淆这篇文章的目标:)
                    【解决方案13】:

                    检查这个question关于分离PHP和HTML,有多种方法可以做到这一点,包括自己编写的模板系统,模板系统如Smarty,PHP作为自己的模板系统等等等等......

                    【讨论】:

                      【解决方案14】:

                      我认为您在这里有两个选择,要么使用 MVC 框架,要么使用惰性模板方式,这会给您的代码带来大量开销。显然我支持前者,我认为学习 MVC 是本书中最好的 Web 开发技巧之一。

                      【讨论】:

                        猜你喜欢
                        • 2019-11-20
                        • 2012-01-16
                        • 2011-07-31
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-07-17
                        相关资源
                        最近更新 更多