保持我的PHP漂亮

时间:2008-09-22 03:46:23

标签: php html formatting

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

但是,这样做会让我的php代码看起来很恐怖......它真的与代码的格式和“形状”混淆。我应该怎么解决这个问题?在我的脚本底部包含自定义“html转储”功能?同样的事情,但包括? Heredocs(看起来不太好)?

谢谢!

14 个答案:

答案 0 :(得分:26)

不要惊慌,每个新的Web程序员都会面临这个问题。

您必须将程序逻辑与显示屏分开。首先,尝试使用每个网页的两个文件制作自己的解决方案:

  • 仅填充变量的PHP代码(无HTML)
  • 另一个HTML和非常少的PHP:这是你的页面设计

然后包括您需要的地点/时间。 E.G:

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 。然后你会尝试一些模板系统和框架,但 LATER 。现在,只需编写代码并从头开始学习。你可以完美地编写像这样的项目,作为一个新手,没关系。

答案 1 :(得分:8)

使用mvc方法。

http://www.phpmvc.net/

这不是你会在几个小时内拿到的东西。你真的需要练习它。主要的是控制器将访问您的模型(数据库层),对您的数据执行操作,然后将其发送到视图以进行渲染。这是过于简单的,但你只需要阅读并练习它来理解它。

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

答案 2 :(得分:4)

尽量将您的内容和布局与代码分开。每次在.php文件中编写任何HTML时,请停下来思考“这个真的是否属于这里?”

一种解决方案是使用模板。查看Smarty模板系统是否易于使用。

答案 3 :(得分:2)

  但是,这样做会让我的php代码看起来很恐怖......它真的与代码的格式和“形状”混淆。我应该怎么解决这个问题?

将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(...)),所有的时间都太冗长了,你总是可以创建一个简短的函数像'h'这样的名字也是如此。)

答案 4 :(得分:1)

从您的问题的声音来看,您的代码中的逻辑和表示可能没有太多分离。在设计应用程序时,这是一个非常重要的考虑因素,原因在于您目前面临的情况。

如果您还没有看过Smarty等PHP模板引擎。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

Wikipedia

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

答案 7 :(得分:0)

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

我推荐QCodo,这太棒了;还有其他 - CakePHP,Symfony。

答案 8 :(得分:0)

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

例如

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

只是一个简单的例子

答案 9 :(得分:0)

如上所述..你正在修复症状,而不是问题..

您需要的是逻辑和表达的分离。可以使用某种mvc框架来完成。即使你不想一直使用mvc框架..至少如果你的逻辑足够复杂,你在解释你所解释的内容时,模板引擎是必须的

答案 10 :(得分:0)

我强烈建议savant而不是聪明,

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

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

答案 11 :(得分:0)

不是在模板系统(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>

Et瞧,你有:

<TABLE>
  <TR>
    <TD>car</TD>
    <TD>green</TD>
  </TR>
  <TR>
    <TD>bike</TD>
    <TD>red</TD>
  </TR>
</TABLE>

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

我认为你有两个选择,要么使用MVC框架,要么使用懒惰模板方法,这会给你的代码带来很大的开销。显然我和前者在一起,我认为学习MVC是本书中最好的网络开发技巧之一。