美文网首页
3、php单例模式

3、php单例模式

作者: 水电梁师傅 | 来源:发表于2018-07-13 00:19 被阅读6次

单例模式,意思大概是一个类有且只能有一个实例,如果用任何方法重复创建的实例,都必须返回最初的那个,或者不返回。

第一步

意思很明显了,所以,我们首先需要一个类,姑且就叫作小明吧。

class Xiaoming
{
    
}
$xiaoming = new Xiaoming();

emmmmm,这个时候就算我继续new一个对象,姑且就叫做$xiaoming2吧,也是可以的,而且他们会在堆内存里面创建不同的对象。和我们想要的同一个对象就不一样了。

考虑一个问题,就算我能创建两个一模一样的对象,那么怎么样才能区分它们是一样的还是不同的呢。
答案是三个等号===,三个等号在php中代表值和类型都相等,这样就可以基本保证两个实例是同一个对象。

class Xiaoming
{
    
}

$xiaoming1 = new Xiaoming();
$xiaoming2 = new Xiaoming();
if($xiaoming1 === $xiaoming2)
{
    echo '是同一个';die;
}
echo '不是同一个'; 
image.png

结果是这样的

第二步

那么开始考虑怎么让这个类创建实例的时候永远返回的就是同一个类。
1 从构造方法开始返回的就是一个一个静态的实例
2 由于需要一个静态的实例变量

class Xiaoming
{
    private static $xiaoming = null;
    public function  __construct()
    {
        return self::$xiaoming;
    }
}
$xiaoming1 = new Xiaoming();
$xiaoming2 = new Xiaoming();
var_dump($xiaoming1);
echo '<br>';
var_dump($xiaoming2);
echo '<br>';
if($xiaoming1 === $xiaoming2)

{
    echo '是同一个';die;
}
echo '不是同一个'; 

大概变成了这个样子,按照我的理解,应该是可以的,他们最后都会返回null值才对。但是还是不行,因为输出出来是这个样子的


image.png
第三步

说明构造函数可能对我们的初始化有影响,那么干脆点,不允许外部调用构造函数了,构造函数改成私有的
自己写一个获取对象实例的函数调用构造函数,如果这个类已经创建过了,那么就直接返回创建过的实例,创建过的实例放到自带的静态变量里头
1 起一个新的函数getinstance()
2 限制原来的构造函数 改成private
3 新的实例只能用新创建的函数获取,self::$xiaoming = new Xiaoming()
4 如果实例已经被创建,则返回自身静态的实例 return self::$xiaoming

class Xiaoming
{
    private static $xiaoming = null;
    private final function  __construct()
    {
        //return self::$xiaoming;
    }
    public static function getinstance()
    {
        if(self::$xiaoming == null)
        {
            self::$xiaoming = new Xiaoming();
        }
        return self::$xiaoming;
    }
}
$xiaoming1 = Xiaoming::getinstance();
$xiaoming2 = Xiaoming::getinstance();
var_dump($xiaoming1);
echo '<br>';
var_dump($xiaoming2);
echo '<br>';
if($xiaoming1 === $xiaoming2)

{
    echo '是同一个';die;
}
echo '不是同一个'; 
image.png

运行结果如上

当然了,if条件判断也可以以下关键字去写: instanceof
php中 instanceof有什么作用
作用:(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口。

顺便呢,在构造方法里头加一个final关键字,以防继承的时候被修改了权限

第四步

基本上来看已经成功了,但是要考虑克隆方法
需要禁掉克隆方法;

class Xiaoming
{
    private static $xiaoming = null;
    private final function  __construct()
    { 
        //return self::$xiaoming;
    }
    public static function getinstance()
    {
        if(self::$xiaoming == null)
        {
            self::$xiaoming = new Xiaoming();
        }
        return self::$xiaoming;
    }
    private final function __clone()
    {
        
    }
}

大功告成

额外步

emmmmm,哪里怪怪的,不专业,把名字改改

class Singleton 
{
    private static $ins= null;
    private final function  __construct()
    { 
        //return self::$xiaoming;
    }
    public static function getinstance()
    {
        if(self::$ins == null)
        {
            self::$ins = new Singleton();
        }
        return self::$ins;
    }
    private final function __clone()
    {
        
    }
}

这样就比较像那么回事了

相关文章

  • pattern设计模式

  • 2018-04-08php实战设计模式

    一、单例模式 单例模式是最经典的设计模式之一,到底什么是单例?单例模式适用场景是什么?单例模式如何设计?php中单...

  • 3、php单例模式

    单例模式,意思大概是一个类有且只能有一个实例,如果用任何方法重复创建的实例,都必须返回最初的那个,或者不返回。 第...

  • 单例模式

    目录 1、设计模式简介 2、什么是单例模式 3、单例模式应用场合 4、单例模式作用 5、单例模式3个要点/要素 6...

  • PHP的单例模式

    php的单例模式和java单例模式的比较 PHP语言是一种解释型的脚本语言,这种运行机制使得每个PHP页面被解释执...

  • 测试文章

    php 设计模式 1.单例模式 单例模式顾名思义,就是只有一个实例。作为对象的创建模式, 单例模式确保某一个类只有...

  • ThinkPHP设计模式与Trait技术

    阅读原文 设计模式 单例模式 工厂模式 对象注册树 示例 运行 Trait技术 自 PHP 5.4.0 起,PHP...

  • 封装的predis单例模式

  • 单例模式和GCD单例实现

    1、传统单例模式2、GCD单例模式3、用宏实现GCD单例模式4、用宏实现GCD单例模式,名称随类名变化而变化 单例...

  • 设计模式之一:单例模式

    摘要:设计模式之一:单例模式目录介绍1.单例模式介绍2.单例模式定义3.单例模式使用场景4.单例模式的实现方式 4...

网友评论

      本文标题:3、php单例模式

      本文链接:https://www.haomeiwen.com/subject/clyuuftx.html