php-单例模式

<?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);

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值