PHP设计模式之单例模式
前言
PHP设计模式多达23种,但常用的就几种,今天就介绍一下其中常用的。
常用的设计模式有三种:单例模式、工厂模式(普通工厂、抽象工厂)
什么叫单例模式
单例模式:创建类的唯一实例
为什么要使用单例模式
1.一个php数据库对外连接是有限的,一般一千个。一个应用中会存在大量的数据库操作,在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源(我所了解的)
简单来说就是可以只创建一次数据库连接实例
2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend framework的FrontController部分。
3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
如何创建单例
为了防止在类外实例化多个对象
1.构造方法私有化
2.防止克隆对象,私有化克隆方法
3.提供内部实例化
1 namespace demo1; 2 3 class Demo{ 4 // 1.私有化构造方法 5 private function __construct(){ 6 7 } 8 9 // 2.提供内部实例化 10 private static $instance = null; 11 public static function getInstance(){ 12 if(is_null(self::$instance)){ 13 self::$instance =new self(); 14 } 15 return $instance; 16 } 17 18 // 3.防止克隆对象,私有化克隆化方法 19 private function __clone(){} 20 } 21 } 22 23 //获取当前唯一实例 24 $demo1 = Demo::getInstance();
实用场景(数据库连接单例模式)
namespace Demo2; class Db{ // 1.实例化构造方法 private function __construct(...$connectParams){ list($dsn,$username,$password) = $connectParams; self::$pdo = new \PDO($dsn,$username,$password); } // 2.内部实例化 private static $pdo = null; public static function getInstance(...$connectParams){ if(is_null(self::$pdo)){ new self(...$connectParams); } return self::$pdo; } // 3.防止克隆 private function __clone(){} } // 实例化 $connectParams = ['mysql:host=localhost;dbname=php_test','root','root']; $pdo=Db::getInstance(...$connectParams);
$pdo1=Db::getInstance(...$connectParams);
// 验证
var_dump($pdo === $pdo1);

浙公网安备 33010602011771号