搭建自己的 PHP 框架心得 (二)- 枕边书

续言

对于本次更新, 我想说:

本框架由本人挑时间完善, 而我还不是 PHP 大神级的人物, 所以框架漏洞难免, 求大神们指出

本框架的知识点应用都会写在博客里, 大家有什么异议的可以一起讨论, 也希望看博客的也能学习到它们

本次更新, 更新了函数规范上的一些问题, 如将函数尽量的独立化, 每一个函数尽量只单独做好一件事情, 尽量减少函数依赖还对框架的整体优化了一下, 添加了 SQ 全局类, 用以处理全局函数, 变量

再次贴出 GITHUB 地址: Sqier 框架 GITHUB 地址

回调函数

替换了很 low 的类名拼装实例化, 然后拼装方法名的用法, 使用 PHP 的回调函数方式:

原代码:$controller_name='Controller\\'.self::$c_name;

$action_name=self::$a_name.'Action';

$controller=new$controller_name();

$controller->$action_name();

修改后代码$controller_name='Controller\\'.self::$c_name;

$controller=new$controller_name();

call_user_func([

$controller,

self::$a_name.'Action'

]);

这里介绍一下 PHP 的函数回调应用方式: call_user_func 和 call_user_func_array:

call_user_func (callback $function [, mixed $parameter [, mixed $...]] )

调用第一个参数所提供的用户自定义的函数

返回值: 返回调用函数的结果, 或 FALSE

call_user_func_array()的用法跟 call_user_func 类似, 只不过传入的参数 params 整体为一个数组

另外, call_user_func 系列函数还可以传入在第一个参数里传入匿名参数, 可以很方便的回调某些事件, 这些特性在复杂的框架里应用也十分广泛, 如 yii2 的事件机制里回调函数的使用就是基于此

VIEW 层和 ob 函数

框架在 controller 的基类中定义了 render 方法来渲染页面, 它会调用类 VIEW 的静态函数来分析加载对应页面的模板publicstatic

functiondisplay($data,$view_file){

if(is_array($data)){

extract($data);//extract 函数解析 $data 数组中的变量

}else{

// 抛出变量类型异常

}

ob_start();

ob_implicit_flush(0);

includeself::checkTemplate($view_file);// 自定义 checkTemplate 函数, 分析检查对应的函数模板, 正常返回路径

$content=ob_get_clean();

echo $content;

}

这里重点说一下 ob(output buffering)系列函数, 其作用引用简明代魔法的 ob 作用介绍:

防止在浏览器有输出之后再使用 setcookie, 或者 header,session_start 函数造成的错误其实这样的用法少用为好, 养成良好的代码习惯

捕捉对一些不可获取的函数的输出, 比如 phpinfo 会输出一大堆的 html, 但是我们无法用一个变量例如 $info=phpinfo(); 来捕捉, 这时候 ob 就管用了

对输出的内容进行处理, 例如进行 gzip 压缩, 例如进行简繁转换, 例如进行一些字符串替换

生成静态文件, 其实就是捕捉整页的输出, 然后存成文件, 经常在生成 HTML, 或者整页缓存中使用

它在 ob_start()函数执行后, 打开缓冲区, 将后面的输出内容装进系统的缓冲区, ob_implicit_flush(0)函数来关闭绝对刷送 (echo 等), 最后使用 ob_get_clean() 函数将缓冲区的内容取出来

类 / index.php/Article 常量和全局类

TP 里的 / index.php/Article 等全局常量用着很方便, 可以很简单的实现跳转等操作, 而定义它的函数 createUrl 函数我又想重用, 于是借鉴 YII 的全局类定义方法:

定义基类及详细方法(以后的全局方法会写在这里)classBaseSqier{

// 方法根据传入的 $info 信息, 和当前 URL_MODE 解析返回 URL 字符串

publicstatic

functioncreateUrl($info=''){

$url_info=explode('/',strtolower($info));

$controller=isset($url_info[1])?$url_info[0]:strtolower(CONTROLLER);

$action=isset($url_info[1])?$url_info[1]:$url_info[0];

switch(URL_MODE){

caseURL_COMMON:

return"/index.php?r=".$controller.'/'.$action;

caseURL_REWRITE:

return'/'.$controller.'/'.$action;

}

}

}

在启动文件中定义类并继承基类;require_once SQ_PATH.'BaseSqier.php';

classSQextendsBaseSqier{

}

在全局内都可以直接使用 SQ::createUrl()方法来创建 URL 了这样, 定义 / index.php/Article 常量就很轻松了

用单例模式定义数据库连接基类classDb{

protectedstatic$_instance;

publicstaticfunctiongetInstance(){

if(!(self::$_instanceinstanceofself)){

self::$_instance=newself();

}

returnself::$_instance;

}

privatefunction__construct(){

$link=new\mysqli(DB_HOST,DB_USER,DB_PWD,DB_NAME)ordie("连接数据库失败, 请检查数据库配置信息!");

$link->query('set names utf8');

}

publicfunction__clone(){

returnself::getInstance();

}

}

使用单例模式的核心是:

私有化构造函数, 使无法用 new 来创建对象, 也防止子类继承它并改写其构造函数;

用静态变量存放当前对象, 定义静态方法来返回对象, 如对象还未实例化, 实例化一个, 存入静态变量并返回

构造其__clone 魔术方法, 防止 clone 出一个新的对象;

DB 类的 sql 查询函数

DB 查询函数是一个很复杂的部分, 它是一个自成体系的东西, 像 TP 和 YII 的查询方法都有其独特的地方我这里暂时先借用 TP 的 MODEL 基类, 有时间再慢慢补这个

嗯, 介绍一下像 TP 的查询里的方法联查的实现, 其诀窍在于, 在每个联查方法的最后都用 return this 来返回已处理过的查询对象

后续

yii2 里的数据表和 model 类属性之间的映射很酷 (虽然被深坑过), 前面一直避开的模块(module, 我可以想像得到把它也添加到 URI 时解析的麻烦) 有时间考虑一下

边写边优化

来源: https://www.php1.cn/detail/php-508ec85fcf.html

做一个php 框架 书,搭建自己的 PHP 框架心得 (二)- 枕边书相关推荐

  1. ssm框架 html搭建,简单的SSM框架搭建教程

    简单的ssm框架的搭建和配置文件 ssm框架里边的配置: 1.src路径下直接存放数据库和log4j的properties文件 2.src路径下建个config包,分别放置ssm的xml文件 3.修改 ...

  2. 用php做一个相册的程序,搭建自己的相册 50个免费的相册程序(上)

    搭建自己的相册 50个免费的相册程序(上) 2009-05-12 18:49:19来源:未知 阅读 () 鉴于国内很多相册服务质量降低,国外的又有被墙之虞,买了国外大空间的童鞋们最保险的图片发布方式就 ...

  3. 使用create-react-appt做一个react的项目搭建

    使用create-react-app(脚手架工具)创建一个初始化项目 1.下载脚手架工具:npm i -g create-react-app 2.创建引用:create-react-app my-ap ...

  4. 如何做一个简单的XX(学生/图书馆)管理系统(二)

    1.闲话 我做的是手机百科系统(什么玩意...)主要是学生管理系统什么的做的人太多了,所以随便选了一个题材 2.界面展示 (数据随便插的勿喷) 3.所用控件 datagridview输出数据,comb ...

  5. vue前端进阶之SSR篇 --- 搭建简单的SSR框架

    目录 理解ssr SSR的重要性 非SSR SSR 了解vapper 制作简易版脚手架 vue框架 环境区分 目录结构 api router views head信息 打包运行 结束 理解ssr 博主 ...

  6. java搭建安卓服务器_无框架完整搭建安卓app及其服务端(一)

    技术背景: 我的一个项目做的的是图片处理,用 python 实现图片处理的核心功能后,想部署到安卓app中,但是对于一个对安卓和服务器都一知半解的小白来说要现学的东西太多了. 而实际上,我们的项目要求 ...

  7. 零基础却想做一个程序员,到底如何学习呢?

    众所周知程序员是21世纪比较吃香的工作.程序员工资高还不需要和复杂的社会打交道.那么作为一个零基础,什么都不懂的人该怎么成为一名程序员?当程序员需要学什么?下面就来分析下. 零基础的我该如何学习? 如 ...

  8. spring boot项目框架的搭建

    spring boot项目框架的搭建 一.实验目的要求 二.实验环境 三.实验内容 任务一 JDK的安装与配置 任务二 maven组件的安装与配置 任务三 设置localRepository 任务四 ...

  9. scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...

    导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...

最新文章

  1. C/C++中的NULL讨论和总结
  2. 【锋利的Jquery】读书笔记五
  3. top.location.href和localtion.href有什么不同
  4. 【OS学习笔记】十五 保护模式三:保护模式下的内存访问机制
  5. 设置clion执行前的cmake命令,和CMAKELIST.txt不冲突
  6. 二十二、标志寄存器与栈(代码设计安全,与子程序寄存器安全类似)
  7. windows2008系统缓存修改
  8. .NET配置文件解析过程详解【转载】
  9. matlab非线性规划
  10. 剑指offer刷题记录
  11. spark 随机森林 源码解析
  12. Python+networkx 网络可视化方法
  13. python数据处理豆瓣_资料 | 利用Python进行数据分析
  14. 通知 Notification的介绍,以及自定义通知
  15. 在上海奋斗的五年---从月薪3500到700万 (一个西北真汉子的人生)
  16. 台式计算机的安装顺序,台式电脑安装步骤教程
  17. 数据运营是什么,怎么做,在哪做
  18. 小米盒子共享电脑文件夹服务器密码,教你用局域网共享文件为小米盒子装软件...
  19. 完整的连接器设计手册_干货 I 关于PCB设计倒角需要了解的一切
  20. 2022-2028年中国继电器行业市场运营格局及竞争战略分析报告

热门文章

  1. 态路小课堂丨三种实现光模块更高传输速率的技术你知道吗?
  2. 巨微MG126低功耗蓝牙芯片实现物联网系统设计
  3. 十大战略工具(7)—— PEST模型
  4. 8 Kafka高级特性-稳定性
  5. java.net.UnknownHostException: www.terracotta.org
  6. win11重置系统之后恢复自己的office服务
  7. C#最全最详细Nancy框架学习(常见报错,控制台应用,添加到现有ASP.Net MVC站点,ajax)
  8. 艺术科技杂志社《艺术科技》编辑部SCD期刊2023年第7期目录查阅
  9. 再看《周渔的火车》 转载一篇不错的影评
  10. 高中数学,三视图求锥体体积解题方法(神级结论一)