9.0 设计模式


  在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式。

设计模式就像是经典的棋谱。不同的棋局,使用不同的棋谐,免得自己再去思考和模索。本节将针对PHP应用程序中最常用的两种设计模式进行详细讲解。

9.1 单例模式


  单例模式是PHP中的一种设计模式,它是指在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象。

就像世界上只有一个月亮,假设现在要设计一个类表示月亮,该类只能有一个实例对象,否则就违背了事实。

在讲解单例设计模式之前,通过一个案例来演示在什么情况时需要使用单例模式,如例9-23 所示

例9-2

 1 <?php
 2      class dbHelper{
 3 private $conn = null;  4 public function __construct(){  5 //打开一个到 MySQL 服务器的连接  6 $this->conn = mysql_connect("localhost","root","");  7 echo "得到一个conn<br/>";  8  }  9  } 10 $db1 = new dbHelper(); 11 $db2 = new dbHelper(); 12 if($db1 === $db2){ 13 echo "一个对象<br/>"; 14 } else { 15 echo "两个对象<br/>"; 16  } 17 ?>

运行结果

得到一个conn

得到一个conn

两个对象

从上例中可以看出,实例化类dbHelper的两个对象请求的数据库连接是两个不同的连接,而在实际开发中,有时会有这样的需求,

在一次HTTP 请求中,保证某个类的对象实例只能有一个。这样可以节省资源开销,此时可以使用单例模式。

单例模式(Singleton)用于为一个类生成一个唯一的对象。(请记住名词    “”三私一公“”)

私有静态属性

私有构造方法

私有克隆方法

公有静态调用队象方法

将上面的dbHelper 类使用单例模式来实现,如例9-24所示

例9-24

<?phpclass dbHelper{private static $instance = null;//定义一个私有的静态属性$instance //声明一个构造方法 private function __construct(){ $this->conn = mysql_connect("localhost","root",""); echo "得到一个conn<br/>"; } //只有通过这个方法才能返回本类的对象,该方法是静态方法 public static function getInstance(){ //如果本类中的$instance为空,说明它还没有被实例化过 if(self::$instance == null){ self::$instance = new self();//实例化本类对象  } return self::$instance;//返回本类的对象  } //阻止用户复制对象实例 public function __clone(){ } } $db1 = dbHelper::getInstance(); $db2 = dbHelper::getInstance(); if($db1 === $db2){ echo "同一个对象"; }else{ echo "不是同一个对象"; } ?>

运行结果

得到一个conn

同一个对象

在上例中,dbHelper类的构造方法使用了private 关键字进行了修饰,即不能在类定义之外使用new来创建对象。

如此一来就只能通过类 名直接调用getinstance0静态方法来创建对象。在第3行代码声明了一个私有的静态属性$instance.

将实例化的对象赋值给它,再判断该属性,如果已经有值,就直接返回,如果其值为null, 就先实例化对象,这样就能保证dbHelper类只能被实例化一次。

最后增加了一个私有的魔术方法_ clone0. 用于防止用户通过clone方法复制对象。

 9.2 工厂模式


工厂模式的作用就是“生产”对象。工厂方法的参数是要生成对象的类名。

为了方便理解工厂模式的作用,接下来通过一个案例来演示如何使用工厂模式获取MySQL和sQLite的驱动对象。

首先在根目录下创建MySQLphp文件。示例代码如下:

1 <?php
2     class  MySQL{ 3 4 //操作SQL的驱动类 5 6 }

然后在根目录下创建SQLite.php文件。示例代码如下:

1 <?php
2 class SQLite{
3 4 //操作SQLite的驱动类 5 6 }

最后定义一个工厂方法来获取各驱动对象,代码如例9-25所示

例9-25

 1 <?php
 2      header('Content-Type: textml;charset=utf-8');
 3 class Db{  4 //工厂方法  5 public static function factory($type){  6 if (include_once $type . '.php') {  7 $classname = $type;  8 return new $classname();  9 } else { 10 echo "出错了!"; 11  } 12  } 13  } 14 //获取MySQL驱动对象 15 $mysql = Db::factory('MySQL'); 16 //获取SQLite驱动对象 17 $sqlite = Db::factory('SQLite'); 18 var_dump($mysql); 19 var_dump($sqlite); 20 ?> 

运行结果

object (MySQL) [1]

object (SQLite) [2]

上例中,第5行代码定义了一个静态方法factor(), 这就是工厂方法,该方法的参数为类名。

第6- 11行代码用于判断类名与参数是否相同,如果相同则创建该类的对象,否则输出“出错了!”。

第15 17行代码分别调用factory()方法获取对应的驱动对象。

从运行结果可以看出,工厂方法成功地创建了两个驱动类对象。

转载于:https://www.cnblogs.com/Prinlily/p/9821664.html

浅谈PHP面向对象编程(九)相关推荐

  1. 浅谈JavaScript 面向对象编程[转]

    这周心血来潮,翻看了现在比较流行的几个 JS 脚本框架的底层代码,虽然是走马观花,但也受益良多,感叹先人们的伟大-- 感叹是为了缓解严肃的气氛并引出今天要讲的话题,"javascript 面 ...

  2. 浅谈PHP面向对象编程(二)

    和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...

  3. 浅谈PHP面向对象编程(二、基础知识)

    和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...

  4. php面向对象静态常量,浅谈PHP面向对象编程(四、类常量和静态成员)

    4.0 类常量和静态成员 通过上几篇博客我们了解到,类在实例化对象时,该对象中的成员只被当前对象所有.如果希望在类中定义的成员被所有实例共享. 此时可以使用类常量或静态成员来实现,接下来将针对类常量和 ...

  5. 浅谈压缩感知(九):正交匹配追踪算法OMP

    浅谈压缩感知(九):正交匹配追踪算法OMP 主要内容: OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一.OMP算法介绍 来源:http://blog.csdn.net/scucj/a ...

  6. 浅谈对java编程思想的理解

    浅谈对java编程思想的理解 刚从学校毕业的时候,对于这种概念的理解少之又少 ,只是单纯的从事编码工作,理解也只是停留在对java基本概念的使用上,很局限!随后工作了快三年的时间里,自己不断的理解这种 ...

  7. python编写函数_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  8. python采用函数编程模式_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  9. python采用函数式编程模式-浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

最新文章

  1. JavaScript强化教程——AJAX
  2. 技术干货 | 闲鱼:一个优秀的 Push 平台,需要经历怎样的前世今生
  3. 问题: 将N个元素使用push_back插入到vector中, 求push_back操作的复杂度。
  4. c ++ 函数的esp指针_在C ++中通过指针访问成员函数
  5. 解决SVN提交代码时的错误:“Could not execute PROPPATCH”
  6. 做为一个程序员,真的要经历学历之痛?互联网企业有多么看重学历!
  7. oracle创建job权限
  8. 支付宝架构师的总结:为什么他们能抗住万亿级流量的高并发?
  9. 利用数组构造MaxTree
  10. 苹果手机使用说明书_使用苹果手机怎么设置重要提醒事项?
  11. 创建asp网站iis发布网站用IP地址进行访问
  12. 【精简操作】Mathtype安装出现错误“53”/未找到.wll文件/选项卡灰色等问题
  13. 学生管理系统——Django
  14. python 九九乘法口诀表好记方法_背诵九九乘法口诀表的好方法,赶快收藏,让孩子熟练记忆并掌握!...
  15. 六款窗口比较器电路设计原理
  16. 从前端角度谈谈单页应用的 nginx 配置
  17. 360天擎与旧版OA冲突的问题
  18. 高校固定资产管理系统
  19. V-Ray 6 带着新工具走来了~V-Ray 6 for 3DS MAX 详解~
  20. 苹果电脑解压不了文件是什么原因?

热门文章

  1. 最小生成树算法讨论(转)
  2. perl one line
  3. 微信公众号接口添加菜单时错误(errcode:40017 invalid button type)
  4. 40%美国人付不起400美元意外开销,大家怎么看?
  5. 【C++设计技巧】C++中的RAII机制
  6. 低级键盘钩子 DLL
  7. 在C++中子类继承和调用父类的构造函数方法
  8. 边框回归的损失函数_分类损失函数,边框回归损失函数
  9. 切片器可以设置日期格式?_Power BI 中的切片器
  10. linux sublime3 插件安装插件,手动安装sublimeText3插件