一、写在前面
php是一个很不错的编程语言,广泛应用于web互联网领域,而PHP的框架,则会提高你的开发效率,而自己动手搭建属于自己的框架,则更是百利而无一害。建议大家一起来搭建这样的框架,虽然是“造轮子”,但写框架的造轮子的目的不是为了造轮子而是为了在造轮子的过程中熟悉其工艺,总结轮子特点,更好的使用轮子。
二、概述框架
【01 当前框架】:
首推 Laravel ,其次是 Yii,Laravel 的设计思想以及在工程实践上的支持,超过 ThinkPHP 好几个世代。如果说原生的 PHP 是火枪, ThinkPHP 就是来福枪,Lavavel 则是冲锋枪。你要打猎的话,带把来福枪完全足够了,但是要上战场,非得更自动化的冲锋枪不行。
可见大家对Laravel的推崇,实际上,我也没用过Laravel,然心向往之,我用过CI框架,觉得小巧优雅,很带劲,ThinkPHP则是国内的一些创业公司和开源项目使用的多,也还不错。现在的公司使用的自己的框架,MVC是一定的,还有分层,工作单元和ORM,现在又引入命名空间,composer管理,可以说也是与时俱进,挺不错的。
【02 使用框架的好处】:
1)Composer 做包管理
2)标准的 Autoload 实现,可以让 `include xxx.php` 成为历史
3)各种依赖注入(把创建对象的权利交给框架)
4)ORM 支持
5)好用的命令行和脚手架
6)丰富的文档和活跃的社区
三、开发自己的框架
我的框架IFrame地址:http://t.cn/RHrR1Sg ,目前是一个很简单简陋的php的框架,后面持续更新填充中。
【01 框架整体】:
首先自己总结一下PHP的MVC框架的工作流程:
简单来说,它以一个入口文件来接受请求,选择路由,处理请求,返回结果。
当然,几句话总结完的东西实际上要做的工作很多,PHP框架会在每次接受请求时,定义常量,加载配置文件、基础类,根据访问的URL进行逻辑判断,选择对应的(模块)控制器和方法,并且自动加载对应类,处理完请求后,框架会选择并渲染对应的模板文件,以html页面的形式返回响应。在处理逻辑的时候,还要考虑到错误和异常的处理。
【02 命名空间&自动加载】:
1) 命名空间: 解决类名重复问题。
2) 自动加载:避免很多include,解决类之间的依赖关系,让你在实例化一个类时,不用关心他所依赖的类,因为使用spl_autoload_register()函数,它可以注册多个函数来代替__autoload函数的功能,我们传入一个函数名为参数,spl_autoload_register会将这个函数压入栈中,在实例化一个当前路径内找不到的类时,系统将会将函数出栈依次调用,直到实例化成功。
路由选择,其本质是根据当前定义的全局URL模式选择合适的方法来分析传入的URI,加载对应的类,并实现对应的方法。
【03 视图实现】:
访问链接是: http://iframe.com/index/testview , 控制器是app/controller/indexcontroller.php , 视图文件是 app/view/testview.html , 赋值方法 assign(),展现方法display() 继承于父类 \core\Iframe 。
整个实现是比较简单的,后续要实现的功能,比如安全过滤,拦截器,钩子之类的后续实现。
【04 模型实现】:
这个模型的实现不是很彻底,因为在控制器内出现了sql及相关的查询,标准的写法是写一个index的model,调用其中的方法,进行数据库相关的操作。数据库的配置当然也可以走配置类。
后续改进的地方:
✔️执行的sql都可以打印出来
✔️可以支持多个数据库的配置链接
✔️实现ORM,实体的增删改映射到数据库中。
【05 composer包管理】:
composer是一个php的第三方资源的包管理,很流行,在框架Laravel中也有实现,今天我们也在自制的框架IFrame中使用composer。需要做下面的三部工作:1)下载 2) 安装 3)使用
1)下载composer:
curl -sShttps://getcomposer.org/installer| php
下载后是一个 composer.phar 二进制包
2)创建composer.json文件:
内容如下:
改成国内的镜像包,否则会很慢,参考:https://pkg.phpcomposer.com/
composer.json中末尾加上 repositories 的声明项。
3)生成包含第三方类库的vendor文件夹:
composer.phar install
然后在框架的入口文件index.php中加上上面的代码,就能使用第三方的类库了。
include("vendor/autoload.php");
例如我这里加载的第三方的输出类 symfony的var-dumper,使用其打印函数 dump(),打印结果有点shell黑底白字的风格,同时支持折叠,还是很赞的。
四、写在最后
本文实现了一个很简单,甚至可以说很简陋的框架,框架本身不重要,关键是理清框架的思路,加深对web开发的理解,同时将一些流行的技术,如composer运用其中,还是不错的。后续该框架还会不断更新改进,期待着大家分享自己的框架,加油吧,phper !