- 清晰的项目结构:易于理解和维护。
- 前端与后端分离:PHP 负责业务逻辑和数据,HTML/CSS/JS 负责展示。
- 模板引擎 (推荐使用):将 PHP 逻辑与 HTML 分离,使设计师和开发者可以并行工作。
- 简单的路由系统:实现 URL 到页面的映射。
- 自动加载类:遵循 PSR-4 标准,无需手动
include或require。 - 配置文件分离:将数据库、网站信息等配置与代码分离。
最终项目结构
my-php-app/
├── app/ # 应用核心目录
│ ├── Controllers/ # 控制器目录
│ │ └── PageController.php
│ ├── Models/ # 模型目录
│ │ └── ExampleModel.php
│ └── Views/ # 视图目录 (存放模板文件)
│ ├── layouts/ # 布局模板
│ │ └── main.php
│ ├── pages/ # 页面模板
│ │ └── home.php
│ └── errors/ # 错误页面模板
│ └── 404.php
│
├── config/ # 配置文件目录
│ └── database.php
│
├── public/ # Web 根目录 (对外可访问)
│ ├── index.php # 前端控制器 (唯一入口)
│ ├── css/
│ │ └── style.css
│ ├── js/
│ │ └── app.js
│ └── images/
│
├── vendor/ # Composer 依赖库目录
│
├── composer.json # Composer 项目配置文件
└── .htaccess # Apache URL 重写规则
第一步:安装和配置基础工具
- 安装 PHP: 确保你的系统已安装 PHP 7.4 或更高版本。
- 安装 Composer: Composer 是 PHP 的依赖管理工具,请务必在你的系统上安装它,访问 getcomposer.org 下载安装。
第二步:使用 Composer 初始化项目并安装依赖
在你的项目根目录 (my-php-app/) 下,运行以下命令:

(图片来源网络,侵删)
# 1. 初始化 Composer 项目 composer init # 按照提示输入项目信息,或者直接按回车使用默认值。 # 这会生成一个基本的 composer.json 文件。 # 2. 安装必要的依赖 # a) 自动加载工具 (推荐) composer require --dev psr/psr-4 # b) 一个简单易用的模板引擎 (我们选择 Plates) # Plates 是原生 PHP 模板引擎,学习成本低,功能强大。 composer require league/plates
安装完成后,你的 composer.json 文件会自动更新,vendor 目录也会被创建。composer.json 会自动添加 autoload 配置。
第三步:创建项目目录结构
根据上面的结构图,手动创建所有必要的目录和文件。
第四步:编写 .htaccess 文件 (用于 URL 重写)
在 public/ 目录下创建 .htaccess 文件,这个文件的作用是:将所有非文件/目录的请求都重写给 public/index.php 处理,从而实现美观的 URL。
# public/.htaccess
# 开启重写引擎
RewriteEngine On
# 如果请求的文件或目录存在,则直接访问
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 否则,将所有请求重写到 index.php
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
重要提示:确保你的 Apache 服务器开启了 mod_rewrite 模块。

(图片来源网络,侵删)
第五步:编写配置文件
在 config/ 目录下创建 database.php,用于存储数据库连接信息等敏感数据。
<?php
// config/database.php
return [
'db_host' => 'localhost',
'db_name' => 'my_database',
'db_user' => 'root',
'db_pass' => '',
];
第六步:编写核心 PHP 文件
public/index.php - 前端控制器
这是整个应用的唯一入口点,所有请求都会先到这里,它的职责是:加载配置、初始化核心组件、处理路由、调用控制器。
<?php
// public/index.php
// 1. 定义应用根目录
define('ROOT_PATH', dirname(__DIR__));
// 2. 加载 Composer 自动加载器
require_once ROOT_PATH . '/vendor/autoload.php';
// 3. 加载配置文件
$config = require_once ROOT_PATH . '/config/database.php';
// 4. 初始化 Plates 模板引擎
$templates = new League\Plates\Engine(ROOT_PATH . '/app/Views');
// 5. 获取请求的 URL ( /home -> home)
$url = $_GET['url'] ?? 'home';
$url = rtrim($url, '/');
$url = filter_var($url, FILTER_SANITIZE_URL);
// 6. 简单的路由处理
switch ($url) {
case 'home':
// 实际应用中,这里会调用控制器和方法
// (new PageController())->home();
echo $templates->render('pages/home', ['title' => '欢迎来到首页']);
break;
case 'about':
echo $templates->render('pages/about', ['title' => '关于我们']);
break;
case 'contact':
echo $templates->render('pages/contact', ['title' => '联系我们']);
break;
default:
// 如果路由不存在,显示 404 页面
http_response_code(404);
echo $templates->render('errors/404', ['title' => '页面未找到']);
break;
}
app/Controllers/PageController.php - 示例控制器
控制器负责接收请求、调用模型、处理数据,并选择视图进行渲染。
<?php
// app/Controllers/PageController.php
// 为了让自动加载器找到这个类,我们需要在 composer.json 中配置命名空间
// "autoload": { "psr-4": { "App\\": "app/" } }
namespace App\Controllers;
class PageController
{
/**
* 渲染首页
*/
public function home()
{
// 这里可以调用模型获取数据
// $data = ExampleModel::getSomeData();
// 将数据传递给视图
// $templates->render('pages/home', ['title' => '首页', 'data' => $data]);
echo "这是首页的控制器方法";
}
/**
* 渲染关于页面
*/
public function about()
{
echo "这是关于页面的控制器方法";
}
}
app/Models/ExampleModel.php - 示例模型
模型负责与数据库交互,处理数据逻辑。
<?php
// app/Models/ExampleModel.php
namespace App\Models;
class ExampleModel
{
public static function getSomeData()
{
// 这里是数据库查询逻辑
// return DB::table('users')->get();
return ['示例数据1', '示例数据2'];
}
}
第七步:编写视图文件 (HTML 模板)
app/Views/layouts/main.php - 主布局模板
这个文件定义了网站的通用结构,其他页面模板会嵌入到这里。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"><?php echo $title ?? '默认标题'; ?></title>
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<header>
<nav>
<a href="/">首页</a>
<a href="/about">lt;/a>
<a href="/contact">联系</a>
</nav>
</header>
<main>
<?php echo $this->section('content'); ?>
</main>
<footer>
<p>© <?php echo date('Y'); ?> 我的 PHP 网站. All rights reserved.</p>
</footer>
<script src="/js/app.js"></script>
</body>
</html>
app/Views/pages/home.php - 首页模板
这个文件只包含首页特有的内容,并继承主布局。
<?php $this->layout('layouts/main', ['title' => '欢迎来到首页']); ?>
<?php $this->start('content'); ?>
<h1>你好,世界!</h1>
<p>这是一个使用 PHP 和 Plates 模板引擎构建的现代化网站框架。</p>
<p>你可以在这里放置首页的内容。</p>
<?php $this->stop(); ?>
app/Views/errors/404.php - 404 错误页面
<?php $this->layout('layouts/main', ['title' => '404 - 页面未找到']); ?>
<?php $this->start('content'); ?>
<h1>哎呀!页面不见了。</h1>
<p>您访问的页面不存在或已被移除。</p>
<a href="/">返回首页</a>
<?php $this->stop(); ?>
第八步:完善 composer.json 自动加载
为了让 App\Controllers 和 App\Models 命名空间下的类能够被自动加载,你需要修改 composer.json 文件。
{
"name": "yourname/my-php-app",
"description": "A modern PHP web application template.",
"type": "project",
"require": {
"league/plates": "^3.5"
},
"require-dev": {
"psr/psr-4": "^1.0"
},
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
}
修改后,在项目根目录运行 composer dump-autoload,让 Composer 生出新的自动加载文件。
第九步:添加一些 CSS 和 JS
在 public/css/style.css 中添加一些基本样式:
/* public/css/style.css */
body { font-family: Arial, sans-serif; margin: 0; padding: 0; background-color: #f4f4f4; }
header { background: #333; color: #fff; padding: 1rem 0; }
nav a { color: #fff; text-decoration: none; margin: 0 15px; }
nav a:hover { text-decoration: underline; }
main { padding: 20px; max-width: 800px; margin: auto; background: #fff; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
footer { text-align: center; padding: 1rem; background: #333; color: #fff; position: absolute; bottom: 0; width: 100%; }
总结与如何使用
- 启动开发服务器:在
public/目录下运行php -S localhost:8000。 - 访问网站:打开浏览器访问
http://localhost:8000,你会看到首页。 - 访问其他页面:尝试访问
http://localhost:8000/about或http://localhost:8000/contact。 - 访问不存在的页面:尝试访问
http://localhost:8000/abc,你会看到 404 错误页面。
这个模板为你提供了一个坚实的基础,你可以基于它进行扩展:
- 更强大的路由:使用
nikic/fast-route或symfony/routing等库。 - 数据库抽象层:使用
illuminate/database(Laravel 的数据库组件) 或medoo。 - 依赖注入容器:使用
php-di/php-di来管理类之间的依赖关系,使代码更解耦。 - MVC 架构:将
index.php中的switch逻辑完全移到控制器中,实现更标准的 MVC 流程。
这个模板从简单开始,同时遵循了现代 PHP 开发的最佳实践,是一个非常好的起点。
