我一直在编写我自己的通用PHP库,我正在考虑如何组织目录结构,但我想在我正式化库的目录结构之前得到人们的想法。
这是我到目前为止所拥有的: https://github.com/homer6/altumo/tree/master/source/php
我以为我可以“按主题”或“按类别”进行。到目前为止,我只能想到一个我喜欢“按类别”的例子:提升http://www.boost.org/doc/libs/1_46_1/?view=categorized
此外,Qt是按模块组织的,但我觉得它有点乱,因为所有内容都有点塞进QtCore http://qt-project.org/doc/qt-5/qtmodules.html
有什么想法吗?
提前致谢。
更新: 我发现了一本非常好的书,它向我展示了许多很棒的图书馆设计惯例:http://www.apibook.com/blog/
更新: 我发现了一篇有趣的文章提到了代码组织(http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html)。在底部,它说: “你的代码树会是什么样子?他希望用这些词来形容它:简单,实用,优雅,正交,可组合。这是理想的,现实有点不同。”
答案 0 :(得分:18)
首先,所选择的结构是折衷决定,这意味着您必须根据您的目的处理某些方面并优先考虑其他方面。您可以遵循一些分组标准,例如:
你应该使用很多标准,但要始终牢记KISS Principle。您可以在The Unified Software Development Process(Ivar Jacobson等人)等书籍中搜索包管理,我希望这可能有所帮助。
答案 1 :(得分:7)
由于它是专用于解决通用问题或为常用功能提供接口的多用途库,因此最好使用subject
结构,这可能是数据类型/技术/语言/协议等,如下所示:< / p>
+ 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.request
将成为执行Http请求的界面Html.Form.UploadFile
将为开发人员提供创建上传文件表单的功能请注意,status_codes
位于util
的{{1}}下。每个子库都有自己的util功能,如Http
lib可能需要datatype_cast_lib才能知道如何处理数据类型。
这种图书馆组织方式大多类似于PECL
的组织好问题,BTW!我经常问自己同样的问题。多年来我一直在组织和重组我的目录结构。这真的取决于项目。我已根据您提供的here结构修改了上面的结构。
答案 2 :(得分:4)
我建议你看看最近两个php 5.3框架Symfony2和Lithium中的事情是如何组织的。
他们背后的核心开发人员(以及其他主要框架开发人员和php名人)在定义标准的php 5.3命名约定时是活跃的,这样他们各自的组件可以相互玩,Zend和其他可能遵循的框架/框架相同的约定:
http://groups.google.com/group/php-standards/web/php-coding-standard
在这两种情况下,捆绑/库都是一等公民,在组织它们时,两者遵循类似的模式。
锂核心尤其是一个独立的图书馆。它的组织如下:
$ ls
LICENSE.txt analysis core g11n security template tests
action console data net storage test util
(我倾向于发现Symfony 2有点混乱/预测性较差,但这只是我自己的看法。)
答案 3 :(得分:4)
请与PSR-0兼容,无论您要使用何种结构。
我个人建议使用PEAR2 directory structure。
答案 4 :(得分:3)
我想说一个好的起点是看看其他框架和/或库是如何做到的。
我个人喜欢Zend Framework的组织方式,具有相当平坦的命名空间,Zend目录中包含所有主要组件。当使用Zend MVC项目结构时,你会得到一个添加的自动加载器,将_转换为/所有类都命名为Zend_Form
并放入Zend目录中名为Form.php的文件中,以便在调用new Zend_Form
时 - 自动加载器会查找Zend/Form.php
。只有'main'类直接位于Zend文件夹中,任何其他类文件(如exception和abstract)都放在Zend/Form
文件夹中,类名称如Zend_Form_Exception
- 这会导致自动加载器查找Zend/Form/Exception.php
。
另一点是,保持后端逻辑远离任何public_html文件夹。 E.G - 只有用户可以直接访问的文件应该在这里(javascript,css和你的loader.php + .htaccess)。然后让loader.php包含它需要的文件,通常是一个目录级别。
外部库通常被视为这样,并与/ lib,/ library和/或/ vendor文件夹中的其余代码分开,以指示外部作者负责这些类。
答案 5 :(得分:3)
我会说这取决于你是如何/如果你使用名称空间等。否则我会看到像ZendFramework目录布局一样的用法(即使它像罪一样丑陋......呵呵)。然后我通常有一个Core
,其中包含所有其他部分可能使用的基本功能,如数组和字符串操作,加密/解密
+ Core
- Array
- String
+ Encryption
- MD5
- SHA1
...
然后我尝试将所有后续文件夹视为隔离的部件/模块。我有一个包含大量JQuery助手的Jquery文件夹吗?那么这可能是一个很好的文件夹来添加。
+ Core
- Array
- String
+ Encryption
- MD5
- SHA1
...
+JQuery
我的JQuery是否需要一些其他“模块”也可能使用的HTML细节?那应该进入Core。例如,我的JQuery助手可能会使用JSON。
+ Core
- Array
- String
+ Encryption
- MD5
- SHA1
...
+ Encoding
- JSON
+JQuery
如果它是Jquery特定的,它应该在JQuery下面。
+ Core
- Array
- String
+ Encryption
- MD5
- SHA1
...
+ JQuery
- Datepicker
总是问一个问题“我的图书馆的某些部分是否会使用和/或扩展?”如果相关功能应该是您的Core的一部分或特定库模块的一部分,您将会有一个好主意。
答案 6 :(得分:2)
<project name>/
application/
configs/
application.ini
controllers/
helpers/
forms/
layouts/
filters/
helpers/
scripts/
models/
modules/
services/
views/
filters/
helpers/
scripts/
Bootstrap.php
data/
cache/
indexes/
locales/
logs/
sessions/
uploads/
docs/
library/
public/
css/
images/
js/
.htaccess
index.php
scripts/
jobs/
build/
temp/
tests/
来源:http://framework.zend.com/manual/en/project-structure.project.html