PHP项目结构

40

我是PHP的新手,想了解关于PHP项目的目录结构。我有Java编程经验,在Java中,src包含Java源代码文件,WEB-INF包含lib和jsp页面。我们在PHP中是否有类似的标准目录结构呢?此外,在PHP中是否存在层次结构,如同Java中的层次结构(例如Web、Service、DAO层)?

我已经浏览了一些链接,但每个链接都给出了不同的答案。

我不确定是否可以将这两种语言进行比较。我只想遵循一些标准。

提前感谢。


我在这里找到了解决方案:https://stackoverflow.com/questions/12572302/what-is-the-best-way-to-organize-files-and-folders-in-an-object-oriented-php-pro - Tibang Kolani
5个回答

36

不是的。PHP可以随心所欲地使用。它可以是非常简单的平面文件,也可以是你想要的任何形式。

话虽如此,有一些约定俗成的编码标准,但是没有对这些标准进行“强制执行”。它们被称为PSR(PHP标准推荐)。这里有更多相关信息:http://net.tutsplus.com/tutorials/php/psr-huh/
您可以在这里逐个查看标准:http://www.php-fig.org/psr/

大多数主流框架都遵循这些标准,如果您要使用其中一个框架,可能会更容易上手。

同样,每个框架、项目、插件、程序等都有不同的布局和不同的项目结构。 一种常见的结构是像这样的:

-framework_dir
-public_html
    -js
    -img
    -css
    -index.php
    -protected/private
        -controllers
        -models
        -views
        -etc

然后他们使用.htaccess文件来阻止对受保护目录的访问。这只是我在几个框架中看到的常见表示法。如果您正在进行个人项目,请使用您熟悉的内容。每个框架都会提供不同的库或方式来访问数据,没有"层",但每个框架都有处理不同领域(电子邮件、数据库、缓存、HTTP、日志等)的对象。由于有几十种流行的框架,所以找到与您的理念或项目相匹配的就取决于您。观看几个5分钟的博客视频,了解一下它是否适合您,然后试运行几天。如果您不喜欢它,请切换到另一个。


谢谢你的帮助。我按照你建议的方法做了。我有一个数据库属性文件,我想从php代码中读取,并希望限制用户通过浏览器访问。你能给我一个示例.htaccess文件,在那里我可以进行更改吗?我尝试过了,但它给我内部服务器错误。 - javafan

22

有了Composer的发明,人们现在有了一个中心地带来注册自己的项目供全世界使用,其他人也能够查看那个代码库并发现相似之处。

结果就是这个:https://github.com/php-pds/skeleton

简而言之:

如果一个软件包有根目录下的文件夹 则它必须被命名为
命令行可执行文件 bin/
配置文件 config/
文档文件 docs/
Web服务相关的文件 public/
其它资源文件 resources/
PHP源码文件 src/
测试代码 tests/

这个规范并没有对srcpublic下需要存在哪些目录进行更深入的建议。

将你的PHP源文件组织到这些目录中的具体方式仍然由你决定,但是这篇文章中提到的建议我也同意:要么按类型分类(控制器、实体、服务),要么按功能分类(用户、登录、购物车、目录、文章、评论) - 后者将属于一个功能的所有代码放在一个目录中(或几个子目录中),这通常似乎是更好的文件组织方式。

按类型组织时,你会经常在不同目录之间切换,而且你无法很好地了解代码的内容 - 你总是有“Controller”,但你很少有“StampCollection”。


9
我倾向于使用基于功能的文件夹结构来组织我的后端项目。每个功能文件夹都有自己的控制器、管理器和路由文件。这对于 API 后端非常有效。它看起来像这样:https://blog.nikolaposa.in.rs/2017/01/16/on-structuring-php-projects/ 例如,我们有一个名为 Customer 的功能,其中包括 CustomerController、CustomerRepository 和 CustomerRoutes 等。
我的文件夹结构如下:
- build/
-- phpdox.xml
-- phpmd.xml
-- phpunit.dist.xml
- config/
- public/
-- .htaccess
-- index.php
-- assets/
- src/
-- Customer/
--- CustomerController.php
--- CustomerRepository.php
--- Customer.php
--- customer.routes.php
- tests/
- vendor/
composer.json
.gitignore

4

很不幸(还是幸运?)你在使用PHP时非常自由,这取决于你。

以下是我的结构:

framework/
controllers/             
models/
configs/
files/
templates/
themes/
tmp/
index.php
init.php
.htaccess

您可以通过 .htaccess 控制访问权限。


CI脚本怎么样? - Bhargav Nanekalva
@NBhargav 你指的是哪些CI脚本? - Mr. B.
如果我想在PHP项目中使用持续集成,你如何维护CI脚本文件夹?你会将它放在哪里?怎么存储? - Bhargav Nanekalva
@NBhargav 什么是“CI脚本”?你是指“Travis CI”吗? - Mr. B.
它可以是任何CI。我正在使用Shippable。存储CI脚本的最佳方法是什么?目前,我将所有的CI脚本都放在项目根目录下的*ci/*中进行维护。有什么建议吗? - Bhargav Nanekalva
2
@BhargavNanekalva 上面的答案在根目录下有一个 index.php,这意味着整个目录树都暴露给外部(可能受到同级 .htaccess 内容的影响)。我会尽量避免这种情况,因为如果没有服务器配置的帮助,隐藏不想暴露的内容会更加困难(但并非不可能)。 - Sven

3
对于一个图书馆,我正在使用以下结构……以及我已经包含了一些我尚未使用的建议。
PROJECT ROOT
|--composer.json
|--README.md
|--docs //for documentation files
|--tests //for Unit Tests
|--vendor //for external libraries (if everything isn't included through composer)
|--examples //examples of the library being used
|--config //any configuration files you may have
|--src  //where the library's actual code "lives"
   |--php //php source code, classes, any other scripts
   |--View //html views, but actually php files that output html
   |--Style //contains .css files
   |--Script //contains .js files
   |--Res   //contains other deliverable resource files. Could be mp3 files, json etc


目前,我只在根文件中使用composer.jsonREADME.mdsrc。但是当我到达那个点时,我可能会像我描述的那样使用其他文件。
我绝不认为这是“正确的”。而且这种设置只能在每个请求都有一个php路由器的情况下才能工作。如果有一个.htaccess文件,你可以将一个.css文件路由到/src/Style/requested_file.css
我想让项目根目录变得更加清晰,我已经实现了这一点。 PHP Fig没有关于目录结构的 PSR...至少我不知道。我希望 PSR-4,自动加载程序会有一些标准,但是...就目录结构而言,实际上并没有。
你可以查看 laravel, wordpress, PHP Mailer其他 PHP 库,以查看示例并了解哪个最适合你。

基本上与上述提到的 https://github.com/php-pds/skeleton 方法相符。有人可能会认为“示例”应该放在“文档”中。它缺少一个专用的“public”文件夹(其名称表明内容是公开的),这可能是处理图像、CSS 和 JS 文件时更好的方法,例如使用“public/Script”而不是“src/Script”。原因是这样从外部访问内部的“src/php”中的 PHP 源代码将更容易受到限制。 - Sven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接