Php 陷入常规,需要帮助突破到下一个层次

Php 陷入常规,需要帮助突破到下一个层次,php,code-organization,Php,Code Organization,我正在一个简陋的网站上工作,用我平庸的自学PHP技能,当前的界面结构如下: <?php if (A) { $output = someFunc(A); } else if (B) { $output = anotherFunc(B); } else if (C) { $output = yetAnotherFunc(C); } else { $output = 'default stuff'; } ?> <html templ

我正在一个简陋的网站上工作,用我平庸的自学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是一种解决方案?但我很难理解如何从这里到那里


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

你似乎已经像很多人那样开始了,一个持续增长的重大if和/或案例陈述。所有这些“如果”检查都需要时间。MVC无疑是一个很好的方法,但是有很多方法可以实现它。我还建议查看前端控制器设计模式,它通常与MVC一起使用

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

$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'] );
}

然后,您的“索引”文件只是一个路由工具,这几乎是前端控制器的概念。

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

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

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

如果你想摆脱常规,我建议你读一本关于设计模式的书。以下是PHP中设计模式的一些示例:

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

  • 战略
  • 指挥部
  • 工厂
上面的链接中有这些模式的PHP示例说明。我确实建议在其他地方阅读更多关于设计模式的内容,但该链接有PHP示例

实际上,我经常将这三种方法结合在一起,以便在与您描述的情况类似或相同的情况下干净地组织代码。它的工作原理如下: -战略。这就像是一个曲奇饼切割器或疯狂的Libs风格的东西。您可以设置执行功能所涉及的基础知识。如果需要,用户(使用基类的程序员)可以重写某些内容,但完成这些工作的基础都已准备就绪。示例:我们需要执行一个业务流程。通常,这包括启动一个事务,完成工作的“主要部分”,然后执行清理和日志记录。在这里使用Stragey/cookie cutter模式似乎有些过分,但通常情况下并非如此:您需要记住进行清理,即使在代码的“核心”中抛出了错误或异常。通过使用Strategy/cookie cutter模式,您可以用最少的样板/重复代码实现所有这些

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

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

这3种设计模式组合在一起对于这种情况非常有效,并且可以生成一些非常干净的代码,您永远不会重复自己的代码


下面的maschka建议使用Smarty,这是一个合理的想法。根据应用程序的不同,更好的方法可能是使用MVC框架。如果您致力于坚持使用PHP,那么我推荐CakePHP,并在这方面取得了巨大成功。它可以帮助您以一种非常好的方式布局您的代码,并帮助您避免麻烦。

+1对于“上述代码可能引发的任何头痛或不愉快记忆”:我很好奇您为什么要使用
include
而不是
require
。这背后有什么原因吗?如果文件丢失,require将发出致命错误,包括警告。