我正在一个简陋的网站上工作,我的平庸,自学成才的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倍,而且很快变成了一个难以维护,令人尴尬的混乱,我不知道如何摆脱它。 / p>
我觉得为每种情况调用的函数都写得很好并且很专注,但是如何处理用户和创建布局的函数之间的中间步骤以及处理返回时,我们感到很茫然。
我觉得MVC是一个解决方案?但是我很难掌握如何从这里到那里......
对于上述代码可能引发的任何令人头疼或令人不快的回忆,我深表歉意。谢谢你的时间。
答案 0 :(得分:5)
你似乎已经开始了许多人的工作方式,这是一个持续增长的大型if和/或案例陈述。所有那些“如果”检查都需要时间。 MVC绝对是一个很好的方法,但有很多方法可以实现它。我还建议您查看Front Controller设计模式,它通常与MVC一起使用。
改变工作方式的一种方法是使用关联数组切换到已定义的“操作”列表。并将您的功能更改为包含。然后你可以有多个函数,变量和其他处理代码。
$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'] );
}
然后你的“索引”文件只是一个路由工具,它几乎就是前端控制器的概念。
答案 1 :(得分:4)
在任何面向对象的代码中,每当你看到一系列if / else或case语句时,如果是/ else / else,它通常更好地由对象层次结构而不是一堆处理。
在您的特定情况下,您可能会为A,B和C设置3个不同的类。只需调用单个$ obj-&gt; doit()方法。 A,B和C各自具有doit()方法的不同实现。
如果你想摆脱困境,我建议你读一本关于设计模式的书。以下是PHP中设计模式的一些示例:http://www.fluffycat.com/PHP-Design-Patterns/
对于这种特殊类型的问题,您可能特别感兴趣的模式是:
使用PHP示例对这些模式的描述在上面的链接中。我建议在其他地方阅读更多有关设计模式的内容,但该链接有PHP示例。
我实际上经常使用其中的3个在与您描述的类似或相同的情况下干净地组织代码。它的工作原理如下: - 战略。这就像一个千篇一律或疯狂的Libs风格的东西。您设置了执行功能所涉及的基础知识。用户(使用基类的程序员)可以根据需要覆盖某些内容,但是完成工作的基础知识都已到位。示例:我们需要执行业务流程。通常,这涉及启动事务,执行工作的“肉”,然后执行清理和日志记录。似乎过度杀戮或许在这里使用Stragegy / cookie-cutter模式,但它通常不是:即使在代码的“肉”中抛出错误或异常,您也需要记住进行清理。通过使用策略/ cookie-cutter模式,您可以用最少的样板/重复代码完成所有这些。
命令:结合我上面提到的策略模式的想法,你在函数中使用较少的样板代码来完成实际的工作。
厂。您可以使用工厂方法为您面临的情况生成适当的命令。
这三种设计模式在这种情况下非常有效,并且可以为您提供一些非常简洁的代码,您可以从不重复自己。
下面的maschka建议使用Smarty,这是一个合理的想法。根据您的应用程序,更好的想法可能是使用MVC框架。如果您坚持使用PHP的想法,那么我推荐CakePHP并取得了巨大的成功。它可以帮助您以非常好的方式布置代码并帮助您摆脱困境。答案 2 :(得分:0)
一般建议:你看过Smarty了吗?我发现它是一个相当有用的模板引擎。它可能需要一些学习,但从长远来看它可能是值得的。