我需要你对php应用程序结构的建议(不是MVC,但更简单)

时间:2010-08-06 20:04:08

标签: php structure

我没有使用任何MVC框架,我的应用程序结构相当简单......

actions/
  registration.php
classes/
views/
  header.php
  footer.php
  registration.php
index.php

操作/和registration.php

<?php
$variable = htmlspecialchars($_GET['name'], ENT_QUOTES).", are you ok!?";
include("views/registration.php");
?>

视图/和registration.php

<?php
include("header.php");
echo $variable;
include("footer.php");
?>

index.php是入口,因此,调用index.php?action=registration将执行actions/registration.php

正如您所看到的,这种结构相当简单,我认为几乎每个php开发人员都在某个时候使用过这种结构。您对此申请结构有什么建议吗?你会如何实现使用这种结构的模块?您是否知道使用此结构进行探索的任何开源应用程序?

3 个答案:

答案 0 :(得分:3)

我看到的主要问题是你要做很多重复自己。

如果你的行为和观点正在做类似的事情,那么它们将维持几乎重复的代码,这些代码在5或6年后会成为一个可怕的噩梦。

我有一个从2001年继承的项目(当时包含平面脚本的想法是在PHP中分离任务的更常见的方法之一)具有类似的结构。现在,经过9年,这是一个总结:

vlad:~/workspace/myproj% find . -name '*.php' | wc -l
4357
vlad:~/workspace/myproj% du -hs
1.8G    .

你可以想象尝试挑选它是多么有趣。

即使您设法将所有操作成功分离到相应的平面文件中,您仍然会丢失数据未正确划分,因此无法以有条理的方式在整个应用中共享。基本上,不使用类来管理您的组织,以及控制哪些操作可以影响哪些数据的功能,一旦您的应用程序蓬勃发展,您就会为自己设置一堆意大利面条代码。此外,您将最终得到一个应用程序,其中代码的1/3行包含语句,其中没有一行真正指示直接发生的事情。这可能导致混乱的野鹅追逐,同时追捕虫子。

您可能想要了解http://wshell.wordpress.com/2009/10/12/encapsulation-in-php/,这似乎可以很好地了解您的组织模型为什么不是一个坏主意。还有一些非常精彩的developerWorks文章,其中一篇文章涵盖了随着项目的发展而进入的一些好习惯:http://www.ibm.com/developerworks/opensource/library/os-php-7oohabits/

答案 1 :(得分:1)

我不是使用include()的传统方式的忠实粉丝。通过基于某些条件插入包含,您基本上将它们用作函数调用。这可能导致各种各样的混乱,因为这些包含文件中的代码驻留在全局范围内,可能与其他代码冲突或导致关于某些事物是否已定义的含糊不清。

我通常做的是包含index.php顶部可能需要的所有PHP文件。然后,根据请求的操作实例化对象或调用函数。并回答你的第一个问题,不,这不会以任何明显的方式减慢应用程序的速度。如果您使用的是缓存系统,请使用Esp。

(这只是简化的伪代码)

include( 'someclass.php');  //contains Some Class definition
include( 'someclass2.php');  //contains Some Class definition
include( 'someclass2.php');  //contains Some Class definition

switch( $action)
{
    ACTION_REGISTRATION:
       $sc = new SomeClass();
       $html = $sc->DoSomething();
       break;

    ACTION_SOMETHINGELSE:
       $sc = new SomeClass2();
       $html = $sc->DoSomeOtherThing();
       break;

    ....

}

//insert into template

echo $html;

答案 2 :(得分:0)

实际上,你在这里一个简单的MVC结构的开头 - index.php充当你的路由器,你/actions文件夹中的代码充当组合控制器和模型。当然,您的/views/*充当了观点。您最好将此模型转换为MVC或HMVC(分层模型视图控制器),因为它可以使系统“模块化”更容易。

话虽如此,有些事情需要注意:

  • 您无法信任用户输入 - 或者可能是用户输入的内容。

    index.php?action= // This counts as user input
    
  • 对于您的观点,最好有一个render函数,当您想要渲染视图时调用它 - 或者更确切地说,当调用echo视图时对于客户端 - 这样,如果您需要发送自定义标头,则不需要重新编码六个视图,以防止在标头之前发送数据。