<?php /** * 1.4 单例模式 * 解决的问题: * 如何确保一个特殊类的实例是独一无二的 * ,也就是说这个实例是它所属类的唯一一 * 个实例对象,并且很容易的对它进行存取? * 解决的方案: * 保证一个类仅有一个实例,并提供一个访 * 问它的全局访问点。 * 该模式包含一种角色: * 1. 单例角色 * 优点: * 1. 始终保持唯一的一个实例。 * 2. 可对此唯一实例进行访问控制。 * 缺点: * 1. 虽然实例数量很少,但每次请求引用时 * 都要检查是否存在类的实例,所以仍然 * 存在一些开销。可以通过使用静态初始 * 化解决此问题。 * 2. 因为不能实例化,所以开发人员必须记 * 住某个类不能使用new关键字产生对象。 * * 使用场景: * 1. 当类只能有一个实例而且客户可以从一 * 个众所周知的访问点访问它时。 * 2. 当这个唯一实例应该是通过子类化可扩展 * 的,并且客户应该无需改代码就能使用一 * 个扩展的实例时。 */ /** * 单例角色,三要素: * 1. 必须有一个静态成员变量保存实例; * 2. 只提供私有的构造函数; * 3. 必须有一个静态函数用于创建获取 * 静态成员变量。 * 4. 私有化克隆函数 */ class DB{ private $con; protected static $db; private function __construct(){ $this->con=new mysqli(‘localhost‘,‘root‘,‘123456‘,‘test‘); echo ‘建立一次数据库连接‘; } public static function getInstance(){ if(! self::$db instanceof self){ self::$db=new self(); } return self::$db; } private function __clone(){} } //客户端 $db=DB::getInstance(); $db2=DB::getInstance(); // $db3=clone $db; echo $db===$db2 ? ‘OK‘:‘NO‘; ?>
时间: 2024-11-18 13:46:04