创建一个PHP框架是一个复杂且耗时的任务,因为它涉及到设计和实现多个组件,如路由系统、数据库抽象层(ORM)、模板引擎、中间件、配置管理、会话和缓存处理等。下面我会提供一个非常基础的 PHP 框架结构示例,它将包括一些基本功能,以帮助你开始构建自己的框架。
1. 项目结构
首先,定义你的项目的文件夹结构。以下是一个简单的结构:
myframework/
├── app/ # 应用代码
│ ├── controllers/ # 控制器
│ ├── models/ # 模型
│ ├── views/ # 视图
│ └── config.php # 配置文件
├── core/ # 核心框架代码
│ ├── Router.php # 路由器
│ ├── Controller.php # 控制器基类
│ ├── Model.php # 模型基类
│ └── View.php # 视图处理
├── index.php # 入口文件
└── .htaccess # URL重写规则
2. 配置文件 app/config.php
<?php
return [
'db' => [
'host' => 'localhost',
'dbname' => 'test',
'user' => 'root',
'pass' => '',
],
// 其他配置项...
];
3. 路由器 core/Router.php
<?php
class Router {
protected $routes = [];
protected $params = [];
public function add($route, $params = []) {
$route = preg_replace('/\{([a-z]+)\}/', '(?P<\1>[^/]+)', $route);
$route = '/^' . str_replace('/', '\/', $route) . '$/i';
$this->routes[$route] = $params;
}
public function match($url) {
foreach ($this->routes as $route => $params) {
if (preg_match($route, $url, $matches)) {
foreach ($matches as $key => $match) {
if (is_string($key)) {
$params[$key] = $match;
}
}
$this->params = $params;
return true;
}
}
return false;
}
public function dispatch($url) {
if ($this->match($url)) {
$controller = $this->params['controller'];
$controller = "App\\Controllers\\" . ucfirst($controller) . "Controller";
if (!class_exists($controller)) {
throw new Exception("Controller class $controller not found.");
}
$action = $this->params['action'] . 'Action';
if (!method_exists($controller, $action)) {
throw new Exception("Action method $action in $controller not found.");
}
$controller = new $controller($this->params);
$controller->$action();
} else {
echo "No route matched.";
}
}
}
4. 控制器基类 core/Controller.php
<?php
abstract class Controller {
protected $view;
protected $params;
public function __construct($params) {
$this->params = $params;
$this->view = new View();
}
abstract public function indexAction();
// 可能需要更多的方法...
}
5. 模型基类 core/Model.php
<?php
class Model {
// 数据库连接和其他模型逻辑...
}
6. 视图处理 core/View.php
<?php
class View {
public function render($view, $params = []) {
extract($params);
require "app/views/$view.php";
}
}
7. 入口文件 index.php
<?php
// 加载自动加载机制
require 'vendor/autoload.php'; // 如果使用composer
// 加载配置
$config = require 'app/config.php';
// 实例化路由器
$router = new Router();
// 添加路由
$router->add('hello/{name}', ['controller' => 'home', 'action' => 'hello']);
// 分发请求
$router->dispatch(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
8. 示例控制器 app/controllers/HomeController.php
<?php
use Core\Controller;
class HomeController extends Controller {
public function indexAction() {
$this->view->render('home/index');
}
public function helloAction() {
$name = $this->params['name'];
$this->view->render('home/hello', ['name' => $name]);
}
}
9. 示例视图 app/views/home/hello.php
<!DOCTYPE html>
<html>
<head>
<title>Hello Page</title>
</head>
<body>
<h1>Hello, <?php echo htmlspecialchars($name); ?>!</h1>
</body>
</html>
10. .htaccess 文件用于URL重写
如果你在Apache服务器上运行,可以使用 .htaccess 文件来去除URL中的 index.php:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]