---
layout: post
title: 自己动手设计灵活、易用、可扩展的php框架
description: 自己开发框架也是锻炼原生的一种手段。写完之后看别的框架也方便多了。如果你遇到一个没有文档或文档极少的框架,可以跟着这个思路摸索着补充。或干脆拿着原生上来就是干
keywords: PHP,PHP framework,php框架
author: admin
date: 2023-09-15 15:49
category: 网络技术
tags: php
---


## 为什么要设计自己的php框架

- 定制化需求:每个项目都有不同的需求和特点,使用通用的框架可能无法满足所有的要求。自定义框架可以根据具体需求进行定制,提供更加灵活和符合项目需求的解决方案。
- 学习和成长:自定义框架是一个很好的学习和成长的机会。通过自己动手开发框架,可以深入理解框架的原理和机制,提升对底层技术的理解和掌握。
- 项目的长期维护:使用自定义框架可以更好地掌握项目的核心代码,便于长期维护和修复bug。不依赖外部框架也意味着更少的版本迁移和依赖问题。
- 性能和效率:自定义框架可以针对具体项目进行优化,提升系统的性能和效率。可以避免不必要的功能和复杂性,减少不必要的资源消耗。
- 技术选型和掌控:通过自定义框架,可以根据自己的技术选型和技术栈来搭建项目。自定义框架可以更好地掌控技术栈和开发工具,符合团队和个人的喜好和习惯。 需要注意的是,自定义框架也有一定的风险和挑战。自定义框架需要投入更多的时间和精力,可能会增加开发的复杂性和难度。在决定自定义框架之前,需要对项目需求和团队能力进行充分的评估和考虑。

一个好的PHP框架应该具有以下几个特点:

- 可扩展性:在开发过程中,需求总是在不断地改变,因此框架需要具有很好的可扩展性,以便随时进行拓展和改进。
- 灵活性:框架应该是灵活的,以便满足不同的开发需求。开发人员应该能够在框架的基础上,自由选择不同的组件和扩展功能,从而实现自己的开发期望。
- 易用性:一个与易用的框架将极大地促进开发的效率,缩短开发周期以及减少人工成本。开发人员应该能够快速掌握框架的基本知识和使用方法,并能够快速构建Web应用程序。

## php框架基本组成

PHP框架说白就是将一些常用到的函数进行封装,后续可以更好的调用,并且在安全性上有比较大的提高,同时在建站的时候速度也能更快,前提是你要熟悉这门框架技术。PHP框架通过提供一个开发Web程序的基本架构,PHP开发框架把PHPWeb程序开发摆到了流水线上。这样理解:框架也是程序,程序就是解决问题的。那么首先你要明确的就是你希望解的问题,之前是否有其他框架可以解决这个问题。

现在web应用普遍使用的是MVC设计模式,即模型(Model)、视图(View)和控制器(Controller)搭建框架首先要明白三者的联系,我们可以设计一个单入口文件模式,具体流程是

index.php-> 获取参数得到Controller控制器名,method方法名,param参数 -> 构造控制器 -> 构造相应的视图、模型 -> 调用相应的方法

简单来说,它以一个入口文件来接受请求,选择路由,处理请求,返回结果。

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。简而言之:

- 模型Model – 管理所有数据库相关的逻辑。模型提供了连接和操作数据库的抽象层。
- 控制器Controller - 负责所有的业务逻辑,比如 if/else 逻辑。
- 视图View – 负责界面显示,如HMTL/XML/JSON显示。


## 直接使用的PHP框架Flight

[轻量级简单的微型PHP框架Flight中文文档](/posts/flight-router.html)

## PHP框架最简单实现方法

1. 在 `index.php` 中定义目录和一些常量,对网站项目整体规划,建立相应的文件夹;
2. 配置Nginx或Apache 将所有的数据请求都重定向 `index.php` 文件;
3. 类自动加载,使用 `composer` 或者 `spl_autoload_register`,这样保证框架的可扩展性:增加Pagination / Upload / Validation 等逻辑功能;
4. 路由:针对不同的网址展示不同网页,可以自己写或使用类库 AltoRouter、Macaw;
5. 模型:与文本数据库/mysql获取数据,使用 medoo 或其他类库;
6. 视图:自己编写模板或使用 twig/smarty 等类库;

这些类库都是开源的,代码量足够小、一般的站点做出来就很惊艳了,运行速度也够快,在最便宜的虚拟主机上都能流畅运行,剩余的就是扩充网站的内容。


### index.php

// 应用目录为当前目录
define('SROOT', str_replace('\\', '/', __DIR__) . '/');

spl_autoload_register(function($className) {
$fileName = __DIR__.'/core/'.str_replace('\\', '/', $className).'.php';
if(file_exists($fileName)) require_once $fileName;
});
require 'route.php';


### htaccess为例配置


# 打开Rerite功能
RewriteEngine On

# 如果请求的是真实存在的文件或目录,直接访问
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 如果访问的文件或目录不是真事存在,分发请求至 index.php
RewriteRule . index.php



### 自动加载

#### composer包管理

composer是一个php的第三方资源的包管理,很流行,需要做下面的三部工作:1)下载 2) 安装 3)使用

1)下载composer:

curl -sShttps://getcomposer.org/installer| php

下载后是一个 composer.phar 二进制包

2)创建composer.json文件:

3)生成包含第三方类库的vendor文件夹:

composer.phar install

然后在框架的入口文件index.php中加上上面的代码,就能使用第三方的类库了。
include("vendor/autoload.php");


#### 使用 spl_autoload_register

自动加载可以避免很多 `include`,解决类之间的依赖关系,让你在实例化一个类时,不用关心他所依赖的类,因为使用 `spl_autoload_register()` 函数,它可以注册多个函数来代替__autoload函数的功能,我们传入一个函数名为参数, `spl_autoload_register` 会将这个函数压入栈中,在实例化一个当前路径内找不到的类时,系统将会将函数出栈依次调用,直到实例化成功。
上节所示的 `index.php` 就是采用这种方式

### 路由选择

路由选择,其本质是根据当前定义的全局URL模式选择合适的方法来分析传入的URI,加载对应的类,并实现对应的方法。
本例使用 `Macaw`



### 模型实现Medoo

标准的写法是写一个index的model,调用其中的方法,进行数据库相关的操作。数据库的配置当然也可以走配置类。
推荐使用 `Medoo`

- ✔️执行的sql都可以打印出来
- ✔️可以支持多个数据库的配置链接
- ✔️实现ORM,实体的增删改映射到数据库中。


### 视图实现

推荐使用 `Twig`

访问链接是: http://higrid.net/index/testview , 控制器是app/controller/indexcontroller.php , 视图文件是 app/view/testview.html , 赋值方法 assign(),展现方法display() 继承于父类 coreIframe 。

整个实现是比较简单的,后续要实现的功能,比如安全过滤,拦截器,钩子之类的后续实现。


### 自己设计的框架代码下载

文章完毕提供
<未完待续>