PHP设计模式及在框架设计中的经典应用.ppt_第1页
PHP设计模式及在框架设计中的经典应用.ppt_第2页
PHP设计模式及在框架设计中的经典应用.ppt_第3页
PHP设计模式及在框架设计中的经典应用.ppt_第4页
PHP设计模式及在框架设计中的经典应用.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PHP设计模式及在框架设计中的经典应用,韩友洪python,目标,了解设计模式与框架给出一个可行的学习设计模式的方法介绍几种常见的设计模式,Agenda,设计模式简述框架简述设计模式与框架软件开发演进过程框架要解决的问题FactorySingletonRegisterAdapterProxyActiveRecordMVC,什么是模式?,demofor(inti=0;i_data$key=$value;publicfunctionget($key)returnisset($this-_data$key)?$this-_data$key:null;使用$ctx=Reistry:getInstance();$ctx-set(xxxx,oooo)$value=$ctx-get(xxxx)使用单实例的全局对象来代替全局的变量,模式三:Registry+Factory(续),保存读写分离的两个mysql连接保存$ctx=Registry:getInstance();$ctx-set(db_read)=Db_Factory:getInstance(db_read)$ctx-set(db_write)=Db_Factory:getInstance(db_read)使用$dbReadObj=$ctx-get(db_read)$dbWriteObj=$ctx-get(db_write),场景四,需要同时支持mysql和postgresql连接实现针对每个数据库,单独写一个驱动实例Db_Factory:getMysqlDB()Db_Factory:getPostgresqlDB()问题如何保持不同DB接口的一致性?,模式四:AdapterPattern,定义接口interfaceIDBpublicfunctionconnect();publicfunctionerror();publicfunctionerrno();publicstaticfunctionescape_string($string);publicfunctionquery($query);publicfunctionfetchArray($result);publicfunctionfetchRow($result);publicfunctionfetchAssoc($result);publicfunctionfetchObject($result);publicfunctionnumRows($result);publicfunctionclose();./接口定义供示例用,模式四:AdapterPattern(续),针对不同的DB实现Driver_DB_MysqlimplementsIDBprivate$link;publicfunctionconnect($server=,$username=,$password=,$new_link=true,$client_flags=0)$this-link=mysql_connect($server,$username,$password,$new_link,$client_flags);publicfunctionerrno()returnmysql_errno($this-link);/.,模式四:AdapterPattern(续),Adpater+Factory实现DB_FactorypublicstaticfunctiongetInstance($adapter=Mysql)/参数化工厂if(!isset(self:$_db$adapter)|($_db$adapterinstanceofIDB)if(include_onceDrivers/DB/.$type.php)$classname=Driver_DB_.ucfirst($type);self:$_db$adapter=new$classname;elsethrownewException(Drivernotfound);returnself:$_db$adapter;使用DB_Factory:getInstance(mysql),场景五,需要延迟初始化一些资源classUserControllerprivate$db;/构造函数中初始化资源function_construct()$this-db=DB_Factory:getInstance(mysql)publicfunctionmanages()$sql=select*frommanagers;$users=$tthis-db-getResults($sql);publicfunctionfoo()echohaha问题foo()方法不需要DB连接,在构造函数里面去连接数据库是不是额外消耗连接资源?,模式五:Proxy,代理模式v1实现共同的接口classProxy_DB_MysqlimplementsIDBprivate$db;publicfunctionquery($query)if(!$this-db)$this-db=DB_Factory:getInstance(mysql)return$this-db-query($query);.延迟初始化、把耗费资源的操作延迟到必须的时候问题每个方法都需重写一次?,Proxy,代理模式v2使用magic方法classProxy_DB_Mysqlprivate$mysql;publicfunction_call($method,$args)if(!$this-mysql)$this-mysql=DB_Factory:getInstance(mysql)retruncall_user_func_array(array($this-mysql,$method),$args);使用:functionfoo()$this-proxy-query($sql);v1和v2这两种方式哪一个更好呢?,场景六,每次我们都需要原生的sql?functionfoo()$sql=select*fromusers;我希望OO,不要有那么多SQL我不懂SQLhowto?nosql:),模式六:ActiveRecord,使用示例$User=newUser();$User-name=hanyh;$User-address=北京;$User-save();or$data=array(name=hanyh,address=beijing);$User-save($data);,ActiveRecord,实现classUserextendActiveBaseCONSTINSERT_SQL=insertintouser(name,address)values(?,?);private$data;protected$fields=array(name,address);publicfunctionsave($data=array()if(empty($data)$this-db-save(SELF:INSERT_SQL,$this-data);else$this-db-save(SELF:INSERT_SQL,$data);privatefunction_set($field,$value)if(in_array($field,$this-fields)$this-data$field=$value;elsethrownewException($fielddoesnotexist);基类负责数据库连接、参数合法性校验等等,MVC模式,架构模式中的一种属于交互系统场景用户界面会变换界面的变换不影响核心功能性代码有一致的方式来区分并组织好存储、业务、显示相关代码,MVC,MVC框架诞生的11个步骤,区分核心功能和用户交互Model实现变化通知功能,需要吗?参考Observer模式设计和实现view设计和实现Controller响应用户的输入、事件把View和Controller关联起来(怎么相互调用?)MVC框架的初始化动态创建View?动态可扩展的插件系统controlle

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论