从0开始构建一个属于你自己的PHP框架

本文详述了构建个人PHP框架的全过程,从自加载、错误异常处理,到路由、配置、ORM和视图设计。推荐使用Vue作为视图层,并提供了完整的框架目录结构和关键模块解释,旨在帮助开发者通过实践学习PHP框架的构建原理。
摘要由CSDN通过智能技术生成

如何构建一个自己的PHP框架

为什么我们要去构建一个自己的PHP框架?可能绝大多数的人都会说“市面上已经那么多的框架了,还造什么轮子?”。我的观点“造轮子不是目的,造轮子的过程中汲取到知识才是目的”。

那怎样才能构建一个自己的PHP框架呢?大致流程如下:

入口文件 ----> 注册自加载函数 ----> 注册错误(和异常)处理函数 ----> 加载配置文件 ----> 请求 ----> 路由  ---->(控制器 <----> 数据模型) ----> 响应 ----> json ----> 视图渲染数据

除此之外我们还需要单元测试、nosql支持、接口文档支持、一些辅助脚本等。最终我的框架目录如下:

原文转发:segmentfault.com

10年架构师领你架构-成长之路-(附面试题(含答案))

(腾讯T3-T4)打造互联网PHP架构师教程目录大全,只要你看完,薪资立马提升2倍(持续更新)

点击与我交流企鹅群.

框架目录一览

app [PHP应用目录] ├── demo [模块目录] │ ├── controllers [控制器目录] │ │ └── Index.php [默认控制器文件,输出json数据] │ ├── logics [逻辑层,主要写业务逻辑的地方] │ │ ├── exceptions [异常目录] │ │ ├── gateway   [一个逻辑层实现的gateway演示] │ │ ├── tools [工具类目录] │ │ └── UserDefinedCase.php [注册框架加载到路由前的处理用例] │ └── models [数据模型目录] │ └── TestTable.php [演示模型文件,定义一一对应的数据模型] ├── config [配置目录] │ ├── demo [模块配置目录] │ │ ├── config.php [模块自定义配置] │ │ └── route.php [模块自定义路由] │ ├── common.php [公共配置] │ ├── database.php [数据库配置] │ └── nosql.php [nosql配置] docs [接口文档目录] ├── apib [Api Blueprint] │ └── demo.apib [接口文档示例文件] ├── swagger [swagger] framework [Easy PHP核心框架目录] ├── exceptions [异常目录] │ ├── CoreHttpException.php[核心http异常] ├── handles [框架运行时挂载处理机制类目录] │ ├── Handle.php [处理机制接口] │ ├── ErrorHandle.php [错误处理机制类] │ ├── ExceptionHandle.php [未捕获异常处理机制类] │ ├── ConfigHandle.php [配置文件处理机制类] │ ├── NosqlHandle.php [nosql处理机制类] │ ├── LogHandle.php [log机制类] │ ├── UserDefinedHandle.php[用户自定义处理机制类] │ └── RouterHandle.php [路由处理机制类] ├── orm [对象关系模型] │ ├── Interpreter.php [sql解析器] │ ├── DB.php [数据库操作类] │ ├── Model.php [数据模型基类] │ └── db [数据库类目录] │ └── Mysql.php [mysql实体类] ├── nosql [nosql类目录] │ ├── Memcahed.php [Memcahed类文件] │ ├── MongoDB.php [MongoDB类文件] │ └── Redis.php [Redis类文件] ├── App.php [框架类] ├── Container.php [服务容器] ├── Helper.php [框架助手类] ├── Load.php [自加载类] ├── Request.php [请求类] ├── Response.php [响应类] ├── run.php [框架应用启用脚本] frontend [前端源码和资源目录] ├── src [资源目录] │ ├── components [vue组件目录] │ ├── views [vue视图目录] │ ├── images [图片] │ ├── ... ├── app.js [根js] ├── app.vue [根组件] ├── index.template.html [前端入口文件模板] ├── store.js [vuex store文件] public [公共资源目录,暴露到万维网] ├── dist [前端build之后的资源目录,build生成的目录,不是发布分支忽略该目录] │ └── ... ├── index.html [前端入口文件,build生成的文件,不是发布分支忽略该文件] ├── index.php [后端入口文件] runtime [临时目录] ├── logs [日志目录] ├── build [php打包生成phar文件目录] tests [单元测试目录] ├── demo [模块名称] │ └── DemoTest.php [测试演示] ├── TestCase.php [测试用例] vendor [composer目录] .git-hooks [git钩子目录] ├── pre-commit [git pre-commit预commit钩子示例文件] ├── commit-msg [git commit-msg示例文件] .babelrc [babel配置文件] .env [环境变量文件] .gitignore [git忽略文件配置] build [php打包脚本] cli [框架cli模式运行脚本] LICENSE [lincese文件] logo.png [框架logo图片] composer.json [composer配置文件] composer.lock [composer lock文件] package.json [前端依赖配置文件] phpunit.xml [phpunit配置文件] README-CN.md [中文版readme文件] README.md [readme文件] webpack.config.js [webpack配置文件] yarn.lock [yarn lock文件]

框架模块说明:

入口文件

定义一个统一的入口文件,对外提供统一的访问文件。对外隐藏了内部的复杂性,类似企业服务总线的思想。

// 载入框架运行文件 require('../framework/run.php');

[file: public/index.php]

自加载模块

使用spl_autoload_register函数注册自加载函数到__autoload队列中,配合使用命名空间,当使用一个类的时候可以自动载入(require)类文件。注册完成自加载逻辑后,我们就可以使用use和配合命名空间申明对某个类文件的依赖。

[file: framework/Load.php]

错误和异常模块

脚本运行期间:

  • 错误:

通过函数set_error_handler注册用户自定义错误处理方法,但是set_error_handler不能处理以下级别错误,E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值