PHP 单例模式
q:什么是 单例模式 ?
a:单例模式 就是让某个类的对象(实例)只能出现一次(且一直存在)。主要使用:静态属性、静态方法。
需要单例模式的场景,例如:
① 使用 Mysql类 时,每一次实例化都会连接一次数据库,同时增加一个对象(实例)。所以同一个 Mysql类 创建多个对象(实例)每必要,增大了开销、浪费了资源。
② 实现 购物车 时,如果 用户打开了多个页面,每个页面实例化一个购物车对象(实例),那么用户在各个页面中下的订单就会被装到不同的购物车里,这样就会出现错误。
注意:PHP中的单例,只是以脚本为单位的单例。
实现步骤为以下 4 步:
class DanLi{
/*
第一步:不允许该类直接进行 new 操作。因为当类被实例化时会自动调用其 构造方法__construct(),而现在把其构造方法声明为 protected 即受保护的。就是说不让外界调用其构造方法,从而阻止该类被直接实例化。
最后对其构造方法声明为 final 即不允许该构造方法被重写。(如果用 final 声明类即不允许该类被继承)
*/
final protected function __construct(){
}
/* 第二步:在类的内部打开一个通道,来实例化对象。*/
static protected $obj = null; //创建一个静态属性,用于接收该类实例化的对象。
static public function makeObj(){ //创建一个静态方法作为通道。
/* 第三步:判断该类的实例是否已经存在。*/
if(self::$obj == null){
self::$obj = new self(); //实例化本类,并将本类的实例 存放在本类的静态属性 $obj 中。
}
return self::$obj;
}
/* 第四步:不允许对象克隆。*/
protected function __clone(){
}
}
$obj1 = DanLi::makeObj();
$obj2 = DanLi::makeObj();
/*
注意:在 PHP 中,连个对象(实例)进行“全等于”关系运算,例如:if($对象1 === $对象2){……}
在这种情况下,就算两个对象的属性和属性值完全一样,也不会相等。只有一种相等的可能性:这两个对象是同一个对象。
*/
if($obj1 === $obj2){
echo '是同一对象';
}else{
echo '不是同一个对象';
}