初学 PHP 单例模式
一. new
对象和 clone
对象
学习单例模式之前,需要先搞清楚这两个关键字的用法,先看一个例子.
<?php
class Foo{
public $bar = 'A string';
}
$foo1 = new Foo;
$foo2 = new Foo;
$foo3 = clone $foo1;
var_dump($obj1, $obj2, $obj3);
上图中红色框框起来的数字代表了 $foo1
$foo2
$foo3
这三个对象分别引用了不同的地址,也就是无论是用 new
关键字,还是 clone
关键字所产生的对象都不是同一个.
问题在于,如果每一次使用该类的实例,都去产生一个新对象,就会浪费资源,单例模式就很好的解决了这个问题,在单例模式中,首先需要禁用 __construct( )
方法,也就意味着不能从类的外部去 new
该类了,其次需要禁用 __clone( )
方法,也就意味不能通过克隆该类的实例获得新对象.
二.单例模式
<?php
class Foo
{
public $bar = 'A string';
//1.创建一个静态私有属性,用于保存当前类的实例
private static $instance = null;
//2.构造方法私有化,从而禁止从外部用new关键字创建实例
private function __construct()
{
}
//3.克隆方法私有化,从而禁止从外部通过clone关键字创建实例
private function __clone()
{
}
//4.定义公共静态方法,用于生成当前类的实例
public static function getInstance()
{
//如果$instance变量中保存的不是当前类的实例
if (!self::$instance instanceof self) {
//那么就new一个当前类,并保存在$instance中
self::$instance = new self();
}
//否则直接返回$instance
return self::$instance;
}
}
$foo1 = Foo::getInstance();
$foo2 = Foo::getInstance();
$foo3 = Foo::getInstance();
var_dump($foo1, $foo2, $foo3);
注意上图中圈起来的数字,三个对象都指向同一个地址.
三. instanceof
关键字
该关键字可以用于判断某对象是否来自于某类,如果是返回true,否则返回false
<?php
class Foo
{
}
$foo = new Foo;
var_dump($foo instanceof Foo); //输出 true
var_dump($foo instanceof stdClass); //输出 false
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
讲的简单易懂:thumbsup:
学习了 :+1: