青风百里

PHP 单例模式
同一个对象可以被多次实例化,每一次实例化都会产生一个新的对象,浪费资源,那么单例模式就可以解决这个问题,在单例模式...
扫描右侧二维码阅读全文
26
2018/05

PHP 单例模式

同一个对象可以被多次实例化,每一次实例化都会产生一个新的对象,浪费资源,那么单例模式就可以解决这个问题,在单例模式中,禁用了__construct()方法,由于在new对象的时候,必须调用构造方法,禁止了构造方法也就禁止了从外部new一个新的对象,并且也禁止了__clone()方法,也就禁止了从外部克隆一个新对象

一.new对象和clone对象


  • 例1
  • 在学习单例模式之前,先来看看new对象和clone对象
<?php
class Demo{
    public $name = '紫霞';
}
$obj1 = new Demo;
$obj2 = new Demo;
$obj3 = clone $obj1;
echo '<pre>';
var_dump($obj1, $obj2, $obj3);
echo '</pre>';

  • 注意图中的#1,#2,#3,这三个对象的序号是不同的,代表了3个不同的对象,也就是说同一个类实例化了三次,你能忍吗?

二.单例模式


  • 例2
<?php
class Demo{
    public $name = '紫霞';
    //1.创建一个静态私有属性,用于保存当前类的实例
    private static $instance = null;
    //2.构造方法私有化,从而禁止从外部用new关键字创建实例
    private function __construct(){

    }
    //3.克隆方法私有化,从而禁止从外部通过clone关键字创建实例
    private function __clone(){

    }
    //4.自定义公共静态方法,用于生成当前类的实例
    public static function createInstance(){
        //如果$instance变量中保存的不是当前类的实例
        if(!self::$instance instanceof self){//例3对instanceof做一个说明
            //那么就new一个当前类,并保存在$instance中
            self::$instance = new self();
        }
        //否则直接返回$instance
        return self::$instance;
    }
}
$obj1 = Demo::createInstance();
$obj2 = Demo::createInstance();
$obj3 = Demo::createInstance();
echo '<pre>';
var_dump($obj1, $obj2, $obj3);
echo '</pre>';

  • 注意图中三个对象都是#1,表明$obj1,$obj2,$obj3都指向同一个对象

三.instanceof关键字


  • 例3
  • 该关键字可以用于判断某对象是否是来自于某类,通俗的讲就是判断某对象是不是某类生的,如果是返回true,否则返回false
<?php
class Demo1{
    public $name = '紫霞';
}
class Demo2{
    public $name = '至尊宝';
}
$obj1 = new Demo1;
$obj2 = new Demo2;
var_dump($obj1 instanceof Demo1);
var_dump($obj2 instanceof Demo1);

Last modification:May 26th, 2018 at 08:24 pm

Leave a Comment