PHP项目之文件夹结构设计

上一篇文章是介绍我们如何开始一个PHP项目,主要申明一些重要的思想,今天这篇文章将是实战。上一篇文章看这里 如何开始一个PHP项目

首先我们要规划PHP框架程序和项目本身的物理路径,如下:

  • geek
  • frame

geek是我们自己的PHP项目目录,frame是我们的框架源文件。我们需要用文件夹的方式做物理隔离。这样做的好处主要有下面三点:

  1. 简洁

    这样非常简洁直观,任何有编程基础的人一眼就能看出哪个是项目文件哪个是框架代码;

  2. 安全

    我们对框架文件做了物理隔离,用户无法通过构造http请求去获取框架代码的权限。虽然很多框架自己就做了类似的安全处理,但是有些是基于服务器的,如果有一天我们换了服务器,可能就踩了大坑。例如Apache下的.htaccess文件,换到Nginx下就会失效;

  3. 方便维护

    框架能动态的与官方同步更新,程序员也不会去随意修改框架的代码,所以可以保证框架代码的完整性。如果框架代码和项目代码糅杂在一起,很容易误操作把框架代码改了。

再来看看geek项目文件夹下的目录结构:

  • geek
    • controllers
    • models
    • views
    • config
    • web
    • runtime
    • common
    • middleware
    • commands

首先,我们项目的目录结构需要按照实际的功能来,千万不要随意创建文件夹。比如最开始我们只需要基本的MVC目录,之后需要把经常会变的配置信息放一起所以引入了config文件夹。再之后需要将用户能访问到的资源统一管理就有了web文件夹。引入缓存和日志埋点之后就加上了runtime文件夹,项目大了之后需要统一封装控制器的父类,这时候需要引入common文件夹来存放全局公共方法。再之后需要使用PHPExcel,微信SDK等就需要单独创建middleware中间件文件夹。最后的最后需要使用PHP命令行模式,就引入了commands文件夹;以上文件夹基本涵盖了一个中小型PHP项目需要用到的所有目录。

文件夹命名方式各个PHP框架下会有略微差异,但是不会差太多。我们只需要遵循一个『见名知其意』的准则就行了。大部分PHP项目都不重视文件夹命名,资源的分类管理。虽然只要功能OK就行了,但是如果我们能把项目做到不用任何注释,任何WIKI去解释各个文件夹的功能不是更好?

最后,我想说说这些年编程的一点感悟。作为码农需要改变一个固有的思维,我们写代码不只是给电脑看的,让人能看懂你的代码比电脑看懂你的代码更重要。特别是现代语言都非常高级,底层封装的非常好,任何一个不傻的人培训3个月就能开始写代码控制电脑,技术人员的参差不齐导致很多软件项目都是一次性的,用完就只能扔掉的垃圾,因为重构成本比新写还大。所以软件行业需要更多能写出『人能读的懂的代码』的人,这种人没有几年经验,没经过几年的磨练是成为不了的;