<?php
//单例模式
/*
//第1步,普通类
class single{}
$s1 = new sigle();
$s2 = new sigle();
// 注意,2个对象是1个的时候,才全等
if($s1 === $s2){
echo 'same';
}else{
echo 'different';
}
//var_dump($s1);
//var_dump($s2);
*/
/*
//第2步,封锁new操作
class single{
protected function __construct(){
}
}
$s1 = new single();
$s2 = new single();
// 注意,2个对象是1个的时候,才全等
if($s1 === $s2){
echo 'same';
}else{
echo 'different';
}
//var_dump($s1);
//var_dump($s2);
*/
/*
//第3步,留个接口来new对象
class single{
public static function getIns(){
return new self();
}
protected function __construct(){
}
}
$s1 = single::getIns();
$s2 = single::getIns();
*/
/*
//第4步,getIns先判断实例
class single{
protected static $ins = null;
public static function getIns(){
if(self::$ins === null){
self::$ins = new self();
}
return self::$ins;
}
protected function __construct(){
}
}
//$s1 = single::getIns();
//$s2 = single::getIns();
//此时满足了单例的基本要求,但是还存在问题,
//如果有新的类继承自该single类,则又打破了单例访问模式
class multi extends single{
public function __construct(){}
}
$s1 = new multi();
$s2 = new multi();
*/
/*
//第5步,构造函数前用final,防止继承时,被修改权限
class single{
protected static $ins = null;
public static function getIns(){
if(self::$ins === null){
self::$ins = new self();
}
return self::$ins;
}
//方法前加final,则方法不能被继承,类前加final,则类不能被继承
final protected function __construct(){
}
}
//$s1 = single::getIns();
//$s2 = single::getIns();
// class multi extends single{
// public function __construct(){}
// }
// $s1 = new multi();
// $s2 = new multi();
//此时加了fanal,成功方式继承方式打破单例模式,但是还是存在问题
//如果s2克隆s1,则又产生了多个对象
$s1 = single::getIns();
$s2 = clone $s1;
*/
//第6步,禁止clone
class single{
protected static $ins = null;
public static function getIns(){
if(self::$ins === null){
self::$ins = new self();
}
return self::$ins;
}
//方法前加final,则方法不能被继承,类前加final,则类不能被继承
final protected function __construct(){
}
//封锁clone
final protected function __clone(){
}
}
$s1 = single::getIns();
$s2 = clone $s1;
// 注意,2个对象是1个的时候,才全等
if($s1 === $s2){
echo '是一个对象<br>';
}else{
echo '不是一个对象<br>';
}
var_dump($s1);
var_dump($s2);
?>