8

我在一个不起眼的网站上工作,我的 PHP 技能平庸,自学成才,目前的界面结构是这样的:

<?php
  if (A) {
    $output = someFunc(A);
  } else if (B) {
    $output = anotherFunc(B);
  } else if (C) {
    $output = yetAnotherFunc(C);
  } else {
    $output = 'default stuff';
  }
?>
<html template top half>

<?php echo $output; ?>

</html template bottom half>

起初这工作正常,而且看起来组织得很好,但所需的功能已经增长了 10 倍,而且它正在迅速变成一个无法维护、令人尴尬的混乱,我不知道如何摆脱它。

我觉得针对每种情况调用的函数都写得很好并且重点突出,但是对于如何处理用户与创建布局和处理返回的函数之间的中间步骤感到茫然。

我觉得 MVC 是一种解决方案?但是我很难掌握如何从这里到那里...

对于上述代码可能引发的任何头痛或不愉快的记忆,我深表歉意。感谢您的时间。

4

3 回答 3

5

你似乎已经像很多人一样开始了,一个持续增长的大 if 和/或 case 语句。所有这些“如果”检查都需要时间。MVC 绝对是一个很好的方法,但是实现它的方法有很多。我还建议您查看通常与 MVC 一起使用的 Front Controller 设计模式。

改变你做事方式的一种方法是使用关联数组切换到定义的“动作”列表。并将您的功能更改为包含。然后你可以有多个函数、变量和其他处理代码。

$actions = array(
'A'=>'action1.php',
'B'=>'action2.php',
'C'=>'action3.php',
'default'=>'action_default.php'
);
if ( isset( $actions[ $_GET['action'] ] ) ) {
    include( $actions[ $_GET['action'] ] );
} else {
    include( $actions['default'] );
}

那么你的“索引”文件只是一个路由工具,它几乎是前端控制器的概念。

于 2010-07-28T01:24:53.460 回答
4

在任何面向对象的代码中,每当您看到一系列 if/else 或 case 语句时,通常最好由对象层次结构而不是一堆 if/else/else 来处理它。

在您的特定情况下,您可能会为 A、B 和 C 设置 3 个不同的类。只需调用一个 $obj->doit() 方法。A、B 和 C 各有不同的 doit() 方法实现。

如果您想摆脱常规,我建议您阅读一本有关设计模式的书。以下是 PHP 中设计模式的一些示例:http: //www.fluffycat.com/PHP-Design-Patterns/

对于这种特定类型的问题,您可能特别感兴趣的模式是:

  • 战略。
  • 命令。
  • 工厂。

这些模式与 PHP 示例的描述在上面的链接中。我确实建议在其他地方阅读有关设计模式的更多信息,但该链接包含 PHP 示例。

实际上,在与您所描述的情况相似或相同的情况下,我实际上经常将其中的 3 个一起使用来干净地组织代码。它的工作原理如下: - 策略。这就像千篇一律或 Mad Libs 风格的东西。您设置了执行功能所涉及的基础知识。如果需要,用户(使用基类的程序员)可以覆盖某些东西,但是做这项工作的基础已经到位。示例:我们需要执行一个业务流程。通常这涉及启动事务,完成工作的“内容”,然后执行清理和日志记录。在这里使用战略/千篇一律的模式似乎有点矫枉过正,但通常情况并非如此:即使代码的“肉”中抛出错误或异常,您也需要记住进行清理。

  • 命令:结合我上面提到的策略模式的思想,您的函数中执行实际工作的样板代码更少。

  • 工厂。您使用工厂方法为您所面临的情况生成适当类型的命令。

这 3 种设计模式放在一起非常适合这种情况,并且可以产生一些非常干净的代码,你永远不会重复自己。

下面的 maschka 推荐使用 Smarty,这是一个合理的想法。根据您的应用程序,一个更好的主意可能是使用 MVC 框架。如果您坚持使用 PHP 的想法,那么我推荐 CakePHP 并取得了巨大的成功。它可以帮助您以一种非常好的方式布置代码并帮助您摆脱麻烦。

于 2010-07-28T01:34:08.877 回答
0

一般建议:您看过Smarty吗?我发现它是一个相当有用的模板引擎。它可能需要一些学习,但从长远来看可能是值得的。

于 2010-07-28T01:26:22.153 回答