先看下面一个例子:
<?php
class A{}
$a1=new A;
$a2=new A;
$a3=new A;
$a4=clone $a1
var_dump($a1,$a2,$a3,$a4);
?>
输出结果如下:
object(A)[1]
(A)[1]
object(A)[2]
(A)[2]
object(A)[3]
(A)[3]
object(A)[4]
A)[4]
表示$a1-a4都是A的实例 他们的id分别为1-4,这样就造成了不必要的浪费,我们完全可以用一个实例就可以使用A内部的方法,这时候单一模式就可以很好的解决问题!如下:
<?php
//单例模式
class A{
private static $instance=null;
//禁止被new 实例化
private function __construct(){
}
//禁止被clone
private function __clone(){
}
//外部实例化方法
public static function getInstance(){
if (!self::$instance instanceof self) {
self::$instance=new self();
}
return self::$instance;
}
}
$a1=A::getInstance();
$a2=A::getInstance();
$a3=A::getInstance();
$a4=A::getInstance();
var_dump($a1);
var_dump($a2);
var_dump($a3);
var_dump($a4);
?>
object(A)[1]
(A)[1]
object(A)[1]
(A)[1]
object(A)[1]
(A)[1]
object(A)[1]
(A)[1]
这么简洁的代码就实现了PHP单列模式,由上面的例子我们可以看出,单列模式的实现主要分为4个步骤:
1.私有静态属性存放本类实例
2.禁止被new实例化
3.禁止被clone
4.对外提供实例化本类的静态方法
//顺便提供一个最近用到的单例模式 redis的单例模式 其他单例模式都可以按这个思路写 比如mysql什么的
class Redis{ public $reids=""; private static $_instance=""; private function __construct() { $this->redis=new \redis; $res=$this->redis->connect('127.0.0.1',6379); if(!$res){ echo "redis connect error"; } } /** * @return string */ public static function getRedis() { if (!self::$_instance instanceof self){ self::$_instance=new self; } return self::$_instance; } public function __call($name, $arguments) { //数组转为参数列表 仅适用于php5.6以上的版本 // return $this->redis->$name(...$arguments); error_reporting(0); return call_user_func_array(array($this->redis,$name),$arguments); } }