[手摸手带你创建php现代化框架] 教程终于写完了
教程地址
从0-1
写出来的。
刚写完的文档,有什么问题,欢迎指正。
(最下面有qq群)
可能会帮助你更容易理解框架的文档
- 深入 Laravel 核心: 这个有点难度,可以简单了解下
- PHP 设计模式全集: 官方的设计模式,略难。
- php设计模式学习: 简单方式实现设计模式,没有那么完善。
- PHP PSR 标准规范: 了解就好了。
源码
教程源码
:php_frame (giteee)原型源码
: php_frame (github)
原型源码
: 先写好框架,就是 原型源码
, 才开始写此教程。教程源码
: 按此教程步骤走下去,会最终变成教程源码
,大部分都是复制 原型源码
的。
设计方向
闭门造轮子
听到很多,不要创建重复轮子了。
最后终究还是要 学习框架底层
= 学习轮子
,这也此框架目的之一。
闭门造轮
成为这个框架最大的特色。
所以此教程不是 手摸手带你组装php现代化框架
, 而是 手摸手带你创建php现代化框架
。
不完善全部代码
指不是框架运行必要的代码, 本教程不会写!
读者自行完善, 这也可以加深读者的印象。
比如路由, get
post
写好了,
put
post
delete
让读者去完善。
最少代码
我个人较为讨厌长代码,每个字都需要去解读。
因为 不完善全部代码
, 所以代码量才少。
如果全部都完善了,那为什么不去看 轮子
源码?
因为代码量多呗 !
目录结构
+---app
| | helpers.php // 函数
| +---controller
| | UserController.php // 示例控制器
| +---exceptions
| | ErrorMessageException.php // 错误消息返回
| | HandleExceptions.php // 继承core/HandleExceptions
| +---middleware
| | ApiMiddleWare.php
| | ControllerMiddleWare.php
| | IsAuthMiddleWare.php
| | WebMiddleWare.php // web.php加载的中间件
| \---models
| User.php // 示例模型
+---config
| database.php // 数据库配置
| log.php // 日志配置
| view.php // 视图配置
+---core
| | Config.php // 配置
| | Controller.php // 基础控制器
| | HandleExceptions.php // 异常&错误 托管处理
| | PipleLine.php // 管道
| | Response.php // 响应
| | RouteCollection.php // 路由
| | SwooleContext.php // 协程上下文管理
| | TestCase.php // 基础测试文件
| +---database
| | | Database.php
| | +---connection
| | | Connection.php
| | | ConnectionInterface.php
| | | MysqlConnection.php // mysql链接
| | | SqlServerConnection.php
| | +---model
| | | Builder.php // 模型构造器
| | | Model.php // 基础模型
| | \---query
| | Grammar.php
| | MysqlGrammar.php // 编译成sql语句
| | QueryBuilder.php // 查询构造器
| +---log
| | | Logger.php // 日志管理
| | \---driver // 不同类型日志实现
| | DailyLogger.php
| | StackLogger.php
| |
| +---request
| | PhpRequest.php // 请求
| | RequestInterface.php
| \---view
| Blade.php // laravel模板引擎
| Thinkphp.php // tp模板引擎
| View.php // 视图适配器
| ViewInterface.php
+---public
| index.php // 单一入口文件
+---routes
| api.php
| web.php // 大部分功能可以在这里运行
+---storage
| daily.log // 框架日志 按日期类型
| php_frame.log // 框架日志
| swoole.pid // swoole的进程pid
+---tests
| ExampleTest.php // 测试示例文件
+---phpunit.xml // phpunit的配置
+---app.php // 框架要经过这个加载
+---swoole.php // swoole的http服务器
文章目录
基础篇
- 第一步 创建框架目录
- 引入composer自动加载
- composer自动加载 (解释篇)
- 添加函数文件helpers.php
- 创建容器 (反射解析依赖 注册树模式)
- 关于psr规范解释
- 关于”容器” “契约” “依赖注入” (解释篇)
- 初始化请求(Request)
- 响应 (Response)
- 路由一 (路由组实现)
- 路由二 (加入中间件)
- 配置信息 (类似laravel)
- 数据库连接 (多例模式)
- 查询构造器 (query builder)
mvc实现
- M 模型实现 (数据映射 + 原型 模式)
- C 控制器实现 + 控制器中间件
- V 视图实现 (Laravel Blade 引擎)
- V 视图切换成 (ThinkPhp 模板 引擎)
其他轮子
- 日志
- 自定义异常 (异常托管)
- 单元测试 (phpunit)
- 替换成swoole的http服务器
- 协程上下文解决request问题
- qps测试
- 发布到packagist.org
qq群
手摸手框架问题解答群
站长交流群
欢迎站长进来换友链&扯淡。
(非站长勿入)
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
支持,mark一下,有空学习学习 :+1:
厉害,大佬,学习了
支持一波,收藏了
支持一下,学习
厉害了。下月学习一下
支持支持
学习一波,辛苦了
如果看云文档上贴的代码的注释 能更完整、规范一点的话,那可就更完美了

学习学习
第一个echo 居然不是 ‘hello word’; 差评
真棒,刚好在找这方面的教程
大牛!!
有点快啊。
膜拜。抽空学习一哈。这样才能更深层的理解框架的运作原理吧。不然整天光用工具了。
:+1:
膜拜
厉害
:+1:大哥好强,想照着你的教程敲一遍
大佬 代码里有4,5处错误 我怀疑是不是大佬你故意埋的坑啊
第4章:创建容器 注册树模式 有问题,应该是调用build()方法
2年的变化,真大呀。加油~
@zhaogh
刚刚我参考了黄教主的教程:通过 PHPStorm 配置 Hyperf 热更新开发环境
Phpstorm设置
swoole.php
创建reload.php
启动
把数字从
1
修改4
都是自动更新的。还有其他方式的 我没试过
https://github.com/ha-ni-cc/hyperf-watch
把他改改 又是一个能用的
Swoole实战之手撸HttpServer框架-25 添加前置进程、修改代码服务自动热更新
这个启动
swoole
的时候启动一个进程,定时器查询文件的md5
。md5
不对就重启。支持大佬,学习了
大佬,能不能给个「群号」,为了专注,我把 手机qq 删了
app.php 的构造函数里有句:self::$instance = $this; 感觉有点多余,因为有 getContainer 方法了。但是删了却报错Fatal error: Allowed memory size of 2147483648 bytes exhausted。想不通为啥会报错。
留个脚印,以后学习。
记录一下,基础篇-4 创建容器,注册树模式
环境:windows10,php7.4
执行 index.php 的时候,提示这个错误
我不理解的为啥会报错,但是我对着
ContainerInterface
中的has方法,发现App
类少了返回类型声明和返回值,我修改如下神奇的是,必须同时保留上图修改的2处才不会报错。
请教一下各位大佬,我这里不添加上图中的2处出现报错的原因是啥(猜测是
php
和psr/container
的版本问题,待我找到psr/container的github项目再补充)。补充,这里应该是强制类型惹的祸,在
Psr\Container\ContainerInterface
这个接口里面,has
方法加了强类型,导致实现的时候也要强制类型,并且返回对应的结果。改正如下
Psr\Container\ContainerInterface
这个接口的has
方法去掉强类型就好,其他的不用变@sinmu 因为容器接口更新后要求
has
方法的实现必须返回bool
值。feat: add return type hints