php 单例模式

Catalogue
  1. 1. 设计模式
  2. 2. 概念
  3. 3. 特点
  4. 4. 实现
  5. 5. 例子
  6. 6. 引用

设计模式

设计模式一共貌似几十种。主要记录下PHP中常用单例模式

概念

单例模式:即一个类只被实例化一次,当其他人对其再次实例化时,便返回第一次实例化的对象。
这种模式可以极大地节约资源。典型应用于数据库类的实例化

特点

1.外部不可以实例化,因此内部实例化函数的类型必须为静态,在类未实例化之前就已经初始化;

2.静态函数只能访问静态变量,所以定义private static $instance;

3.静态变量的访问写法为:类名::$变量名,在类内部可以直接写self:$instance

4.可以用instanceof这个关键字检测变量中存放的是不是当前的类实例。

实现

三私一公

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php  
//php下的单例模式
class Single
{
private static $instance;
//防止在外部进行 实例化 new Single
private function __construct()
{

}

public static function getInstance()
{
if(self::$instance instanceof self)
{
self::$instance =new self;
}

return self::$instance;
}

//防止被克隆 $b=clone $a
private function __clone()
{

}
}

例子

单例类文件 :Danli.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class Danli
{
//保存类的实例的静态成员变量
static private $_instance=null;
//私有的构造方法
private function __construct(){
echo "这是一个构造方法<br>";
}
//用于访问类的实例的公共的静态方法
static public function getInstance(){
if(!(self::$_instance instanceof Danli)){
echo "实例化<br>";
self::$_instance = new self;
}
return self::$_instance;
}
//类的其它方法
public function test(){
echo "调用成功<br>";
}
}

index.php

1
2
3
4
5
6
7
8
9
10
index.php
<?php
//加载类文件
require "Danli.php";
//第一次调用类的实例
$first = Danli::getInstance();
$first->test();
//第二次调用类的实例
$second = Danli::getInstance();
$second->test();

输出结果:

1
2
3
4
实例化
这是一个构造方法
调用成功
调用成功

引用

记录点滴,成为更好的自己。 — weizhuo.ma