Php 我应该如何组织一个通用编程库&x27;s目录结构?

Php 我应该如何组织一个通用编程库&x27;s目录结构?,php,organization,Php,Organization,我已经编写了自己的通用PHP库一段时间了,我正在考虑如何组织目录结构,但我想在正式确定库的目录结构之前先了解一下人们的想法 以下是我到目前为止的情况: 我想我可以“按主题”或“按类别”来做。到目前为止,我只能想到一个我喜欢的“按类别”的例子:Boost 另外,Qt是按模块组织的,但我认为这有点混乱,因为所有东西都塞进了QtCore 有什么想法吗 提前谢谢 更新: 我发现了一本非常棒的书,书中向我展示了许多优秀的图书馆设计惯例: 更新: 我发现一篇有趣的文章提到了代码的组织()。底部写着: “你

我已经编写了自己的通用PHP库一段时间了,我正在考虑如何组织目录结构,但我想在正式确定库的目录结构之前先了解一下人们的想法

以下是我到目前为止的情况:

我想我可以“按主题”或“按类别”来做。到目前为止,我只能想到一个我喜欢的“按类别”的例子:Boost

另外,Qt是按模块组织的,但我认为这有点混乱,因为所有东西都塞进了QtCore

有什么想法吗

提前谢谢

更新: 我发现了一本非常棒的书,书中向我展示了许多优秀的图书馆设计惯例:

更新: 我发现一篇有趣的文章提到了代码的组织()。底部写着: “你的代码树会是什么样子?他想用这些词来描述它:简单、实用、优雅、正交、可组合。这是一个理想,但现实有点不同。”

/
应用/
配置/
application.ini
控制器/
助手/
形式/
布局/
过滤器/
助手/
剧本/
模型/
模块/
服务/
观点/
过滤器/
助手/
剧本/
Bootstrap.php
资料/
缓存/
索引/
地区/
日志/
会议/
上传/
文件/
图书馆/
公开的/
css/
图像/
js/
.htaccess
index.php
剧本/
工作/
建造/
临时工/
测验/

来源:

我想说一个好的开始是看看其他框架和/或库是如何做到这一点的

就我个人而言,我喜欢这种组织方式,它有一个相当平坦的名称空间,所有主要组件都在Zend目录中。当使用Zend MVC项目结构时,您会得到一个添加的自动加载程序,将所有类命名为
Zend_Form
,并将其放入Zend目录中名为Form.php的文件中,以便在调用
新Zend_Form
时,自动加载程序会查找
Zend/Form.php
。只有“main”类直接位于Zend文件夹中,任何附加类文件(如异常和摘要)都放在
Zend/Form
文件夹中,类名(如
Zend\u Form\u Exception
)会导致自动加载程序查找
Zend/Form/Exception.php

另一点是,让后端逻辑远离任何公共的html文件夹。例如,这里应该只有用户可以直接访问的文件(javascript、css和loader.php+.htaccess)。然后让loader.php包含它需要的文件,通常是一个目录级别


外部库通常被视为这样,并与/lib、/library和/或/vendor文件夹中的其余代码分离,以表明外部作者负责这些类。

首先,选择的结构是一个折衷的决定,这意味着您必须根据您的目的处理某些方面并优先考虑其他方面。您可以遵循一些分组标准,例如:

  • 功能性内聚性,我认为这应该是您设计中最强大的。具有相同或类似功能的类/文件/资源应放在一起
  • 组件层次结构,这取决于您选择的粒度级别,这意味着如果您更喜欢细粒度组件而不是粗粒度组件,那么一个文件夹中的文件/资源会更多或更少。这可以使用文件夹层次结构和嵌套进行控制
  • 更改,某些文件比其他文件更容易更改,您必须记住这一点,以便根据修改的可能性提供文件夹层次结构
  • 可扩展性,要使框架对几乎任何场景都有用和适用,您必须提供扩展组件和功能的可能性。为扩展添加一个文件夹(又名插件)是一个好主意

你应该使用很多标准,但要始终记住这些标准。您可以在(Ivar Jacobson et al.)等书中搜索包管理,我希望这会有所帮助。

我建议您看看最近的两个php 5.3框架和

他们背后的核心开发人员(以及其他主要框架开发人员和php名人)积极定义标准php 5.3命名约定,以便他们各自的组件可以相互使用,Zend和其他可能遵循相同约定的库/框架:

在这两种情况下,bundle/library都是一流的公民,在组织它们时,它们遵循相似的模式

特别是锂核心,它本身就是一个图书馆。它是这样组织的:

$ ls
LICENSE.txt analysis    core        g11n        security    template    tests
action      console     data        net         storage     test        util

(我倾向于认为Symfony 2有点混乱/预测性较差,但这只是我自己的观点。)

由于它是一个多用途的库,专门用于解决多功能问题或为常见功能提供接口,因此最好按
主题
进行结构,它可能是数据类型/技术/语言/协议等

+ Http
  - request
  - response
  + util
    - status_codes
+ Html
  - Validator
  + Form
    - UploadFile
  + Tag
+ JavaScript
  - JSON
+ Ajax
+ XML
  - Reader
  - Writer
  - Parser
+ DataType
  - Array
  - Integer
  - String
  - Double
  - Float
  + util
    - datatypes_cast_lib
最重要的是:

  • Http这是一种协议,因此您的
    Http.request
    将是执行Http请求的接口
  • Html是一种标记语言,因此
    Html.Form.UploadFile
    将为开发人员提供创建上传文件表单的功能
  • JavaScript这是一种编程语言,因此您的JavaScript.JSON可能会解决从JSON到数组的转换问题
  • Ajax哪种是技术
  • XML这是一种标记语言
  • <
    + Http
      - request
      - response
      + util
        - status_codes
    + Html
      - Validator
      + Form
        - UploadFile
      + Tag
    + JavaScript
      - JSON
    + Ajax
    + XML
      - Reader
      - Writer
      - Parser
    + DataType
      - Array
      - Integer
      - String
      - Double
      - Float
      + util
        - datatypes_cast_lib
    
    + Core
     - Array
     - String
     + Encryption
       - MD5
       - SHA1
       ...
    
    + Core
     - Array
     - String
     + Encryption
       - MD5
       - SHA1
       ...
    +JQuery
    
    + Core
     - Array
     - String
     + Encryption
       - MD5
       - SHA1
       ...
     + Encoding
       - JSON
    +JQuery
    
    + Core
     - Array
     - String
     + Encryption
       - MD5
       - SHA1
       ...
    + JQuery
      - Datepicker