代码之家  ›  专栏  ›  技术社区  ›  Kirzilla

我需要你关于php应用程序结构的建议(不是MVC,而是更简单的东西)

  •  0
  • Kirzilla  · 技术社区  · 14 年前

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

    操作/注册.php

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

    视图/注册.php

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

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

    如您所见,这种结构相当简单,我认为几乎每个php开发人员都在某个时候使用过这种结构。你对这个应用程序结构有什么建议吗?如何使用这种结构实现模块?你知道有没有使用这种结构开发的开源应用程序?

    3 回复  |  直到 11 年前
        1
  •  3
  •   sleepynate    14 年前

    我看到的主要问题是你要重复很多遍。

    如果您的操作和视图正在做类似的事情,它们将维护几乎重复的代码,这在5或6年后可能会成为可怕的噩梦。

    我有一个继承自2001年的项目(早在include flat scripts思想是PHP中分离任务的一种更常见的方法时),它的结构类似。9年后的今天,总结如下:

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

    你也许想试试看 http://wshell.wordpress.com/2009/10/12/encapsulation-in-php/ ,这似乎很好地解释了为什么你的组织模式可能是个坏主意。还有一些非常棒的developerWorks文章,其中一篇介绍了随着项目的发展需要养成的一些好习惯: http://www.ibm.com/developerworks/opensource/library/os-php-7oohabits/

        2
  •  1
  •   GrandmasterB    14 年前

    我不太喜欢使用includes()的传统方式。通过基于某些条件插入include,基本上就是将它们用作函数调用。这会导致各种各样的混乱,因为这些包含的文件中的代码驻留在全局范围内,可能与其他代码冲突,或者导致是否定义了某些内容的模糊性。

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

    (这只是简化的伪代码)

    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;
    
        3
  •  0
  •   Sean Vieira    14 年前

    实际上,你这里有什么 简单MVC结构的开始-- index.php 是作为你的路由器和你电脑里的代码 /actions 文件夹充当组合控制器和模型。你的 /views/*

    也就是说,有些事情需要注意:

    • 你不能相信用户的输入——或者 由用户输入。

      index.php?action= // This counts as user input
      
    • 对于你的观点,最好有一个 render echo 这是客户端的视图——这样,如果需要发送自定义头,就不需要重新编码六个视图,只需防止数据在头之前发送。