位置: 编程技术 - 正文

自制PHP框架之设计模式(php框架开发教程)

编辑:rootadmin

推荐整理分享自制PHP框架之设计模式(php框架开发教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php框架设计模式,搭建自己的php框架,搭建自己的php框架,怎么用php写一个简单框架,怎么用php写一个简单框架,php框架搭建网站教程视频教程,搭建自己的php框架,怎么做php框架,内容如对您有帮助,希望把文章链接给更多的朋友!

为什么要使用设计模式?

设计模式,我的理解是为了达到“可复用”这个目标,而设计的一套相互协作的类。

感兴趣的读者可以阅读《Design Patterns: Elements of Reusable Object-Oriented Software》,四位作者(Gang of Four)在书中列举了业界闻名的种设计模式。

这里先介绍我们框架要涉及的三种设计模式。

单例模式(singleton)

单例模式可以保证一个类只有一个对象实例, 常用在数据库存取类,从而节省硬件资源的消耗。

这里,我们改写上一章节的MySQL类

这里要注意的是,如果实例化一个MySQL类,我们不再写

而是这样:

因为只有getInstance这个静态函数,才能保证只调用一次MySQL类的构造函数。

单例模式是很常用的设计模式,这里不再赘述。

外观模式(Facade)

因为命名空间的问题,外观模式可以保证一个类的诸多方法看似是“一个类提供的”,这里我们先设计一个简单的服务提供者类

这个类只有一个Write方法,就是把参数打印出来

然后定义一个Facade类

自制PHP框架之设计模式(php框架开发教程)

要理解这个类,我们只要关注最后一个函数,就是__callstatic魔术方法。这个方法就是Facade类型对象或者其子类在调用他自身没有定义过的函数时,就会调用__callstatic方法,而这个方法最后调用了call_user_func_array函数,就是把任务交给提供这项服务的类去完成,同时完成参数的传递。

我们再写一个Facade子类

这里注意,子类实现了父类没有具体实现的getFacadeAccessor方法,这个方法就是要告诉父类的__callstatic方法:“我作为Facade,代表的是什么哪个类,任务就由他来实现吧”,从语法上看,只是返回了一个表示类名的字符串。所以父类起初并不知道它的子类都代表着什么“服务提供者类”,只有当子类的静态函数被调用后,因为子类没有该静态函数,所以父类的__callstatic方法被启动了。

抽象工厂(Factory)

我对抽象工厂有一个粗俗的理解:“对象与字符串的对应”,也就是用一个字符串就可以创造一个类的对象。这种做法主要用在两种情况下是很方便的:

1.类名不稳定,会在项目中频繁修改

类名修改,很多时候并不是设计者的“命名洁癖”或者“命名强迫症”导致的修改,而是在项目的不断迭代,发觉这个类设计的不合理。如果这个类用的不频繁,那么改个类名只要手工做一些小的修改即可,但是如果这个类通篇存在于代码之中(假如是数据库类),那修改工作量就大了,当然,我们也可以对代码文件使用“字符串替换”,但是假如一个PHP写成的项目,PHP文件有几十上百个,这也是不合理的事。

2.类的设计者并不是类的使用者

类的设计者和类的使用者不是同一个开发人员,那么记忆一个字符串或许比记忆一个类名要生动的多。我们都学过计算机网络原理,都知道记忆一个域名要比记忆一个IP地址要生动的多,这就是DNS解决的问题。

因为抽象工厂很多教材都有涉及,不再赘述,本文将介绍一下目前非常流行的服务容器。

我们希望整个工程项目中,DB类,Session类,FileSystem类“拿来即用”,不用每次繁琐的初始化,比如写$db=new DB(arg1,arg2);这类语句,也希望DB等类型的对象像一个“全局”变量一般,在整个程序运行期间,随时可以调用。

服务容器可以让调用DB等类型的程序员不用知道这个类太多的细节,甚至可以用一个字符串的别名来创建这样一个对象。

我们定义一个服务容器类

可以把服务容器简单的看成一个全局变量,bind方法就是用关联数组把字符串和构造函数做绑定。

至此,有了服务容器,我们的Model类就要做修改了

观察上面代码,我们同时用了单例模式和服务容器。

总结:如果要做一个PHP框架,应该要做好代码的复用。设计模式一直是很多争论的焦点,“究竟该不该使用设计模式?”,本文开始,我也努力回避“过于纠结这个问题”,我认为,设计模式有其存在的价值,至少在具体项目中,确实在很多版本迭代中节省了工作量,提高工作效率,但是如果在一个小项目中为了“秀一下我会设计模式”而使用设计模式,就不合理了。

PHP中include和require的区别实例分析 先编辑command.php文件echo'hello'.PHP_EOL;然后编辑console.php文件for($i=1;$i=3;++$i){require'command1.php';}原本想要包含并执行这个echo,没想到写错了文件名,如果是req

Laravel实现autoload方法详解 用了一阵Laravel后发现很少有include和require,觉得有点奇怪,思考Laravel是怎么完成文件导入的。其实Laravel依旧还是用include或者require的,只是都写在一个

php中Ioc(控制反转)和Di(依赖注入) 先看一个例子:phpclassA{public$b;public$c;publicfunctionA(){//TODO}publicfunctionMethod(){$this-b=newB();$this-c=newC();$this-b-Method();$this-c-Method();//TODO}}classB{publicfunctionB(){//TODO

标签: php框架开发教程

本文链接地址:https://www.jiuchutong.com/biancheng/290934.html 转载请保留说明!

上一篇:自制PHP框架之模型与数据库(php框架yii)

下一篇:PHP中include和require的区别实例分析(php中require和include是用来做什么的)

  • 小规模附加税减半征收什么时候开始
  • 代收的水资源税收入是否计入企业所得税
  • 无形资产摊销的会计科目
  • 飞机票的快递费多少钱
  • 当月减少的固定资产当月停止折旧
  • 固定资产核算的心得体会
  • 固定资产盘点账实不符
  • 销售折让会影响单价吗
  • 商场返现活动怎么入账
  • 自产产品用于捐赠的会计处理
  • 房地产企业销售未完工产品预计毛利率
  • 费用怎样确认是可抵扣暂时性差异?
  • 损益类科目计入哪个表
  • 银行负债类账户包括哪些
  • 成立分公司总公司有什么影响
  • 房地产开发企业资质管理规定
  • 不需要抵扣的怎么直接进费用
  • 公户转账给个人没有票
  • 看看大家退休的单子
  • 如果月初忘记抄税直接开票怎么办
  • 业务宣传费企业所得税扣除标准是多少
  • 与工程有关的差旅费是否可以计入在建工程呢?
  • 高新企业研发人员
  • 担保贷款造成的损失可以税前扣除吗?
  • 常见的linux系统磁盘
  • 购买机器设备配件账务处理
  • 企业福利费支出范围
  • 经营出租固定资产折旧额计入什么科目
  • 广告业进项都能开什么票
  • 王者荣耀中廉颇是哪一个族的族长
  • 公积金可以支付二手房首付款吗
  • 图片注入php
  • 房产证和不动产权证都要办理吗
  • 增值税专用发票查询系统官方网站
  • 保险中介市场现状和基本特点
  • php imagettftext()函数
  • 大自然水族馆怎么样
  • vue中下载文件
  • 劳务费用 税
  • 提坏账准备的会计分录 2022
  • nginx for linux
  • OpenAI Translator | 基于ChatGPT API全局翻译润色解析插件
  • Js模板字符串添加点击事件
  • 存放中央银行款项借方表示什么意思
  • 农民专业合作社法
  • 一般纳税人购进免税农产品如何抵扣进项税额
  • python中循环怎么写
  • vue was assigned to but
  • mongodb主从复制和副本集架构有什么联系和区别
  • 异地预缴附加税会计分录
  • 股票期权的所得税处理
  • 专款支出和事业支出
  • 债权投资的交易费用计入成本还是利息调整
  • 不合格品的处理方式一般包括哪些
  • 出租车费用分录
  • 累计折旧的计提会计分录
  • 技术服务费怎么做分录
  • 投标保证金退回是不是没中标
  • 叉车上牌流程注册登记
  • 怎么开劳务派遣工作证明
  • mysql error1418
  • sql2000卸载干净
  • windows延缓写入失败怎么修复
  • 新买的读卡器不读卡,提示放入驱动盘
  • win10怎么解除网吧下载限速
  • linux tar压缩文件命令
  • ubuntu 21.10安装
  • nodejs回调函数返回值如何传递给其它函数
  • opengl矩形
  • div css页面布局
  • python中get怎么用
  • js判断元素是否显示
  • jquery教程chm
  • python安装后怎么用
  • jquery的form方法
  • 安徽税务发票查询入口
  • 出口退税收入怎么做账
  • 北京车位过户手续费多少
  • 运城取暖费网上怎么交
  • 新疆国税网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设