PHP单例设计模式

单例设计模式:
/*
        单例设计模式:单例就是一个仅有一个实例(只能得到一个对象)
        问题:
            1:每一个new都会得到一个新对象,每一次得到新对象,构造方法就会被执行一次
                解决方法:不能让类在外边随便new,把构造方法进行私有化
            2:在类外不能new了,那么这个类就不能被实例化,构造方法不执行了
                解决方法:在类内定义一个方法,在这个方法里去new这个类
            3:由于在类外没有对象,所以没有办法访问到into方法
                解决方法:让into方法变成静态的,然后通过范围运算符使用类里边的 into方法
            4:在类外不能new了,但是可以在类外使用范围运算符多次new(在类外多次访问into方法)
                解决方法:在类里设置一个成员属性,用于存储在类内得到的对象
            5:由于没有对象的产生,所以$this无法使用
                解决方法:把成员属性变成静态的,然后在静态的方法中使用范围运算符访问静态的成员属性
    */

    class Model{
        public $link;
        static public $tabName;
        static public $obj=null;
        //构造方法:在new对象的时候自动调用
        private function __construct(){
            echo "连接了一次数据库";
        }
        static public function into($tabName){
            Model::$tabName=$tabName;
            if(is_null(Model::$obj)){
                Model::$obj=new Model;
            }
            return Model::$obj;//你们都承认了,它是对象    
        }
        public function select(){
            $tabName=Model::$tabName;
            $sql="select * from {$tabName}";
            echo $sql;
        }
    }
    /*
    $user=new Model();
    $type=new Model;
    $goods=new Model;
    */
    //Model::into('goods');
    $user=Model::into('user');//对象
    //访问类里边的方法 对象->方法名
    $user->select();
    $type=Model::into('type');
    $type->select();
  
  1. new test();  //通过new实例化对象
  2. 通过clone复制对象
  3. 通过序列化反序列化得到对象实例
  4. 通过类的反射实例化对象
如何阻止这种实例化实现理想的单例模式
  1. new test();//通过new实例化对象: 通过更改构造方法为private 阻止使用方直接new 对象 
  2. 通过clone复制对象 : 通过定义private __clone()阻止复制操作
  3. 通过序列化反序列化得到对象实例 :通过定义__wakeup()阻止对象的反序列化。
  4. 通过类的反射实例化对象:暂时还没有相应的方法去阻止使用此方法实现对象多例
例化对象:暂时还没有相应的方法去阻止使用此方法实现对象多例
单例模式有三个特点:
    1、一个类只有一个实例
    2、它必须自行创建这个实例
    3、必须自行向整个系统提供这个实例
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值