H3(Helper)-优雅高效的MVC开发框架
github地址:https://github.com/github-lai/h3
gitee地址:https://gitee.com/lai2020/h3
路由重写、请求分发、MVC分层设计、数据库类高效封装、命名空间、Autoload、PHP方法高效运用、N种缓存、权限认证、Linux和Windows系统兼容、开发部署多环境兼容布局、请求周期、数据类封装、单例模式、接口规范.....欢迎加入H3的有趣世界!
PHP毫无疑问是当前比较流行的web开发语言,特别在构建小型应用时灵活快捷方便的特点更是令人满意。但是,当面对大中型应用时,PHP就表现得越来越力不从心了,无论是开发效率还是运行效率层面上,大中型应用还是Java更加理想。后来,经过实践的检验,发现把PHP从大中型应用中对立来看并不合适。与Java和C#这些编译型的语言相比,PHP的性能效率尤显不足,但是在前端展示层面上,PHP依然有着可以比较的优势,那就是她轻快灵活,可移植性好。总体而言,PHP在门户展示,产品展示,信息展示等前端界面的应用依然是受相当多用户的欢迎。
自看到PHP第一面开始就一直保持关注。PHP的受欢迎不是虚言,业界有着丰富的各种PHP系统和框架应用,我们随处可见的框架有Yii,ThinkPHP,Laravel,CakePHP,ZendFramwork,Symfony,CodeIgniter等等,而基于这些框架的CMS内容管理系统更是遍地开花,作为一个PHP爱好者,基于对PHP已有的认知,所有的框架不过是对PHP的重新包装,其底层的PHP基础完全没有变化,所有这些框架都没有基础的创新,于是,与其去学习这么多PHP框架,不如我自己写一个框架,用我自己的想法去包装PHP,按自己的意愿去完成各种框架所实现的功能,于是写Helper的动机就出现了。
Helper,名字不是很亮眼,但是很直观,就是一个助手的意思。作者的意图很简单,通过对PHP的高效封装,实现中小型应用的高效快速开发,解决以前不用框架时的繁琐和低效(当然,如果你精通前面提到的任意一款框架,也能达到相同的目的)。并且,PHP入门简单是人尽皆知的,一个刚毕业的大学生可以自学PHP,并立刻投入开发,那么,写一个PHP框架又能有多大的困难呢?
现实跟理想有点出入!!!
上网查找了一遍框架的实现原理,绝大部分都是通过Apache的UrlRewrite模块通过路由分发来实现的,据说还有通过404重定向来实现路由分发的(无奇不有)。Helper最后决定采用普遍的做法,使用UrlRewrite模块来实现。重定向将请求路径以参数的形式发送到入口文件-根目录下的index.php来处理,剩下的工作就是根据请求路径的分析来确定分发的路径。框架实现的第一步:写一个请求分发路由器!
刚开始并没有严格按照MVC的思想来设计,只要能将请求分发到指定处理的文件,即可完成请求,未必需要按照MVC的思想来照搬。实践证明,这种想法是可行的。所以,第一版本的Helper是PHP代码和HTML代码大量混合的模式,虽然看着很难受,但是起码可以正常执行了。接下来到数据库访问类的封装。原计划设想按照MyBatis思想进行设计:在配置文件配置好SQL,然后设计一套方法向这些语句传递参数,组装完成的SQL执行。后来一想,这种设计方式等同于让开发人员直接去编写原生的SQL语句来执行了,如同没有封装,遂放弃。后来第一版采用了非常无聊的普通封装:设计方法,传递sql需要的参数进行sql的组装。刚开始只是简单封装了where()、delete()、update()、save()方法,并且这些方法具有严重缺陷:无法指定主键条件。例如:save($obj),要更新的数据行使用$obj的第一个属性值来识别,即是说,如果第一个传递的不是Iid唯一识别ID,那么该方法根本无法识别要保存的是哪一行。
事实很残酷,遇到的困难还有以下这些:1,设计__autoload()时导致类查找效率低下,重复加载,或者找不到对应类或者查找目录太多等。2,模板和母版怎么进行高效组装。3,缓存怎么设计(缓存的有效期,更新机制,缓存的种类,如何规避缓存击穿)。4,怎么设计有效的日志记录模块(无论是开发调试还是部署上线,日志都是非常必要的)。5,网站的开发和上线配置怎么设计能够兼容2种环境上下文。6,请求周期的异常处理机制。7,请求过程中的权限认证机制怎么设计。8,数据从数据库查询出来之后如何封装,让开发用户能用最优雅的方式调用。9,PHP连接mysql过程中出现频繁打开和关闭数据库连接的情况怎么处理(单例模式)。10,在Windows下开发,部署到Linux上时,出现各种系统不兼容的问题,比如大小写敏感问题。
坚持不懈地努力!!
上面提到的问题,经过精心地思考,一个一个地解决了,但是有些问题直到今天,仍然未能找到完美解决方案。可是当大部分问题得到解决时,Helper的雏形就出现了。最后采用的MVC设计思想和命名空间等这些思想的运用为问题的解决作出了极好的贡献。
未来Helper的路还有很长,但是至少Helper已经勇敢迈出去了艰难的第一步,未来可期,期待有您的加入!!!
基本要求:
  1. PHP version >= PHP5.3(因为使用了命名空间)
  2. 设置apache AllowOverride All(因为开启了url重写)
  3. 开启apache模块 rewrite_module
  4. .htaccess文件重要
目录结构说明

vendor/h3 框架代码,新手可以不管
log 程序报错时,特别是数据库操作出错会将错误日志记录到该目录下
res 存放资源文件:图片,css,javascript
tmp 文件缓存存放目录
usr 用户空间,用户的开发工作主要围绕该目录进行,该目录存放了控制器,视图和model层的代码,auth.ini和config.ini基本配置信息

usr子目录结构说明

auth 授权认证器
ctrl 控制器目录
model 数据访问对象目录
tpl 模板缓存目录
  • 2020/04/24
    H3拆分成2部分,框架framework核心依赖代码和项目结构代码,并分别加入composer大家庭!
    1、创建h3项目:composer create-project h3/h3:dev-master
    2、添加依赖: composer require h3/framework:dev-master
  • 2020/04/08
    更名为H3,发布github和gitee版本库进行开源维护
  • 2019/11/01
    完成了lib/db/mysql类的重新设计,采用链式调用的原则进行sql的组装,
    舍弃了原来的table文件夹存储了表的字段的这种落后的设计,
    修复了原来的Update和Save的缺陷(无法指定唯一条件,原来的设计都是默认取第一个字段当做是更新的id)
    下一步设计计划:在ctrl里面的代码里完全隔离对db操作的链式调用,完全整合到model层。
    db的链式调用相当于直接写sql语句,如果泛化到ctrl层的话,维护起来会越来越困难
  • 2019.08.23
    缓存机制初步建立
  • 2019.08.21
    完成了linux下的调试,并优化了视图渲染的方法,增加模板重复赋值检测,进行错误提示,不允许重复赋值摸板变量
  • 2019-05-13
    控制器ctrl到tpl摸板的数据传输采用简单的变量替换法则,目前仅仅支持字符串变量,所有类型的变量如数组等 都必须转换成字符串的形式传递给tpl摸板,否则替换失败
  • 2019-01-20
    采用了MVC设计思想,使用的摸板html避免了php代码与html代码混合的情况发生,达到php代码单独一个类文件统一管理的目的
  • 2016-08-18
    加入命名空间,解决autoload的加载效率问题,由原来的多次查找变为一次查找,提高了效率
    加入后台菜单的文件配置功能,通过文件配置可以控制后台菜单的按权限显示

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册