面向对象中的单例模式(PHP)
2017-08-27 20:17
513 查看
单例模式的主要作用是保证在面向对象编程设计中,一个类只能有一个实例对象的存在。在很多操作中,比如建立目录、数据库连接都有可能会用到这种技术。和其他面向对象的编程语言相比,PHP中使用单例设计尤为重要。因为PHP是脚本语言,每次访问都是一次独立执行的过程,而在这个过程中一个类中有一个实例对象就足够了。例如自定义数据库的操作类,设计的原则就是在一个脚本中,只需要实例化一个数据库操作类的对象,并且只连接一次数据库就可以了,而不是在一个脚本中为了执行对个SQL语句,单独为每个SQL语句实例一个对象,因为实例化一次就要连接一次数据库,这样非常降低效率,单例模式就为我们提供了这样实现的可能。另外,使用单例的另一个好处在于可以节省内存,因为它限制了实例对象的个数。
要编写单例设计模式,就必须让一个类只能实例化一个对象,而想让一个类只实例化一个对象,就先要让一个类不能实例化对象。在上例中,不能在类的外部直接使用new关键字去实例化DB类的对象,是因为DB类的构造方法使用了private关键字进行了封装。但根据封装的原则我们可以在类的内部方法中实例化本类的对象,所以声明了一个getInstance()方法,并在该方法中实例化本类的对象。但成员方法也是需要对象才能访问的,所以在getInstance()方法前使用static关键字修饰,成为静态方法就不使用对象,而是通过类名来访问了。如果调用一次getInstance()方法,就在该方法内实例化一次本类对象,这并不是我们想要的结果。所以就需要声明一个成员属性$obj,将实例化的对象引用赋值给它,再判断该变量,如果已经有值,就直接返回,如果值是null,就去实例化对象,这样就能保证DB类只被实例化一次。又因为getInstance()方法是static修饰的静态方法,静态方法又不能访问非静态的成员,所以成员属性$obj也必须是一个静态成员,而且又不能让外部类直接访问,所以也需要使用private关键字封装起来。
<?php /** * 声明一个类Db,用于演示单例模式的使用 */ class DB{ //声明一个私有的,静态的成员属性$obj;因为静态方法只能访问 private static $obj = null; /*构造方法,使用private封装后则只能在类的内部使用new去创建对象*/ private function __construct(){ /*在这个方法中完成一些数据库连接等操作*/ echo "数据库连接成功!"; } //只有通过这个方法才能返回本类的对象,该方法是静态方法,用类名调用 static function getInstance(){ if(is_null(self::$obj)){//如果本类中的$obj为空,说明还没有被实例化过 self::$obj = new self();//实例化本类对象 } return self::$obj; } //执行SQL语句完成数据库的操作 function query($sql){ echo $sql; } } //只能使用静态方法getInstance()去获取DB类的对象 $db = DB::getInstance(); //访问对象中的成员 $db -> query("select * from user"); ?>
要编写单例设计模式,就必须让一个类只能实例化一个对象,而想让一个类只实例化一个对象,就先要让一个类不能实例化对象。在上例中,不能在类的外部直接使用new关键字去实例化DB类的对象,是因为DB类的构造方法使用了private关键字进行了封装。但根据封装的原则我们可以在类的内部方法中实例化本类的对象,所以声明了一个getInstance()方法,并在该方法中实例化本类的对象。但成员方法也是需要对象才能访问的,所以在getInstance()方法前使用static关键字修饰,成为静态方法就不使用对象,而是通过类名来访问了。如果调用一次getInstance()方法,就在该方法内实例化一次本类对象,这并不是我们想要的结果。所以就需要声明一个成员属性$obj,将实例化的对象引用赋值给它,再判断该变量,如果已经有值,就直接返回,如果值是null,就去实例化对象,这样就能保证DB类只被实例化一次。又因为getInstance()方法是static修饰的静态方法,静态方法又不能访问非静态的成员,所以成员属性$obj也必须是一个静态成员,而且又不能让外部类直接访问,所以也需要使用private关键字封装起来。
相关文章推荐
- 深入PHP面向对象、模式与实践——高级特性(4)
- php面向对象值单例模式
- php设计模式之面向对象基础知识
- 深入php面向对象和模式
- 面向对象中的单例模式(PHP)
- PHP面向对象深入理解之四(设计模式-观察者模式)
- 深入PHP面向对象、模式与实践——高级特性(2)
- php面向对象之单例模式--125
- PHP面向对象:单态设计模式(连接数据库)
- 深入PHP面向对象、模式与实践(第 2 版) 高清PDF版下载
- 深入PHP面向对象、模式与实践——生成对象(2)
- 《Head First 设计模式》代码之PHP版(面向对象学习)第1/2页
- 老生常谈PHP面向对象之命令模式(必看篇)
- 深入PHP面向对象、模式与实践——高级特性(6)
- PHP面向对象深入研究之【组合模式与装饰模式】
- php面向对象中static及单态模式
- php面向对象开发之——组合模式
- PHP面向对象学习笔记之二:生成对象的设计模式
- php面向对象之装饰模式
- 深入PHP面向对象、模式与实践——让面向对象编程更加灵活的模式(3)