[手摸手带你创建php现代化框架] 教程终于写完了

教程地址#

手摸手带你创建 php 现代化框架

0-1 写出来的。

刚写完的文档,有什么问题,欢迎指正。
(最下面有 qq 群)

可能会帮助你更容易理解框架的文档#

  1. 深入 Laravel 核心: 这个有点难度,可以简单了解下
  2. PHP 设计模式全集: 官方的设计模式,略难。
  3. php 设计模式学习: 简单方式实现设计模式,没有那么完善。
  4. PHP PSR 标准规范: 了解就好了。

源码#

教程源码:php_frame (giteee)
原型源码: php_frame (github)

原型源码: 先写好框架,就是 原型源码 , 才开始写此教程。
教程源码: 按此教程步骤走下去,会最终变成教程源码 , 大部分都是复制 原型源码 的。

设计方向#

闭门造轮子#

听到很多,不要创建重复轮子了。

最后终究还是要 学习框架底层 = 学习轮子 , 这也此框架目的之一。

闭门造轮 成为这个框架最大的特色。

所以此教程不是 手摸手带你组装php现代化框架 , 而是 手摸手带你创建php现代化框架

不完善全部代码#

指不是框架运行必要的代码,本教程不会写!

读者自行完善,这也可以加深读者的印象。

比如路由,get post 写好了,
https://cdn.learnku.com/uploads/images/202009/11/25979/PdJ81QhSkt.png!large

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 群#

手摸手框架问题解答群#

[手摸手带你创建php现代化框架] 教程终于写完了

站长交流群#

欢迎站长进来换友链 & 扯淡。:smile:
(非站长勿入)
[手摸手带你创建php现代化框架] 教程终于写完了

本作品采用《CC 协议》,转载必须注明作者和本文链接
专心学习不瞎搞
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 46

支持,mark 一下,有空学习学习 :thumbsup:

4年前 评论

厉害,大佬,学习了

4年前 评论
xiaoAgiao

支持一波,收藏了

4年前 评论

支持一下,学习

4年前 评论

厉害了。下月学习一下

4年前 评论
流浪剑客

支持支持

4年前 评论
AloneUtopia

学习一波,辛苦了 :+1:

如果看云文档上贴的代码的注释 能更完整、规范一点的话,那可就更完美了 :see_no_evil:

4年前 评论
lyxxxh (楼主) 4年前
AloneUtopia (作者) 4年前
lyxxxh (楼主) 4年前

第一个 echo 居然不是 ‘hello word’; 差评

4年前 评论
lyxxxh (楼主) 4年前

真棒,刚好在找这方面的教程

4年前 评论

大牛!!

4年前 评论
lyxxxh (楼主) 4年前

有点快啊。

4年前 评论
lyxxxh (楼主) 4年前

膜拜。抽空学习一哈。这样才能更深层的理解框架的运作原理吧。不然整天光用工具了。

4年前 评论

:thumbsup:大哥好强,想照着你的教程敲一遍

4年前 评论

大佬 代码里有 4,5 处错误 我怀疑是不是大佬你故意埋的坑啊

4年前 评论
lyxxxh (楼主) 4年前
cookie20201208 (作者) 4年前
cookie20201208 (作者) 4年前
lyxxxh (楼主) 4年前

第 4 章:创建容器 注册树模式 有问题,应该是调用 build () 方法 file

4年前 评论
lyxxxh (楼主) 4年前
秦晓武

2 年的变化,真大呀。加油~

4年前 评论

file 大佬,发现此处该改为 get,getApp 不存在此方法呢

4年前 评论
lyxxxh2 4年前
zhaogh (作者) 4年前

@zhaogh
刚刚我参考了黄教主的教程: 通过 PHPStorm 配置 Hyperf 热更新开发环境

Phpstorm 设置

file

Name: php
File Type: PHP
Scope: Project Files
Program: sh
Arguments: $ProjectFileDir$/reload.sh
Show Console: Always

swoole.php

file

创建 reload.php

#!/bin/bash
basepath=$(cd `dirname $0`; pwd)
cd $basepath
if [ -f "./storage/swoole.pid" ];then
cat ./storage/swoole.pid
cat ./storage/swoole.pid | awk '{print $1}' | xargs kill && rm -rf ./storage/swoole.pid
fi
php swoole.php start  
# 如果你是docker: https://learnku.com/articles/39143#reply148006

启动

file

file

把数字从 1 修改 4 都是自动更新的。

还有其他方式的 我没试过

  1. https://github.com/ha-ni-cc/hyperf-watch
    把他改改 又是一个能用的 :joy:

  2. Swoole 实战之手撸 HttpServer 框架 - 25 添加前置进程、修改代码服务自动热更新

这个启动 swoole 的时候启动一个进程,定时器查询文件的 md5
md5 不对就重启。

4年前 评论

file 这些代码就不能格式化下吗,看着好难受 :sweat_smile:

4年前 评论
白小二

大佬,能不能给个「群号」,为了专注,我把 手机 qq 删了

4年前 评论
lyxxxh (楼主) 4年前

app.php 的构造函数里有句:self::$instance = $this; 感觉有点多余,因为有 getContainer 方法了。但是删了却报错 Fatal error: Allowed memory size of 2147483648 bytes exhausted。想不通为啥会报错。

3年前 评论

留个脚印,以后学习。

3年前 评论

记录一下,基础篇 - 4 创建容器,注册树模式

环境:windows10,php7.4

执行 index.php 的时候,提示这个错误

PHP Fatal error:  Declaration of App::has(string $id) must be compatible with Psr\Container\ContainerInterface::has(string $id): bool in D:\sinmu\code\myframe\php_frame\app.php on line 34

我不理解的为啥会报错,但是我对着 ContainerInterface 中的 has 方法,发现 App 类少了返回类型声明和返回值,我修改如下

file

神奇的是,必须同时保留上图修改的 2 处才不会报错。

请教一下各位大佬,我这里不添加上图中的 2 处出现报错的原因是啥(猜测是 phppsr/container 的版本问题,待我找到 psr/container 的 github 项目再补充)。

我尝试搜索了 Declaration of App::has($id) must be compatible with,stackoverfollow 有个帖子说是 php 版本得小于 7.2,但是上面说到 psr/container 的版本是 1.x,详情参见 stackoverflow.com/questions/665262...


补充,这里应该是强制类型惹的祸,在 Psr\Container\ContainerInterface 这个接口里面,has 方法加了强类型,导致实现的时候也要强制类型,并且返回对应的结果。

改正如下

  1. Psr\Container\ContainerInterface 这个接口的 has 方法去掉强类型就好,其他的不用变
  2. 实现类的方法里面加上强类型和 return type 即可
3年前 评论
lyxxxh (楼主) 3年前
sinmu (作者) 3年前

@sinmu 因为容器接口更新后要求 has 方法的实现必须返回 bool 值。
feat: add return type hints

file

3年前 评论
sinmu 3年前

未填写
文章
89
粉丝
108
喜欢
481
收藏
724
排名:108
访问:8.8 万
私信
所有博文
社区赞助商