38、PHP中的单例模式

阅读() @2018-10-29 18:16:06

什么是单例模式呢?首先要理解PHP中面向对象的内存知识!

如下代码,创建一个类A,然后实例化两个对象a和b,那么在内存中就会有a、b两个对象,这两个对象之间除了公共类A的方法和属性,其他方面没有任何的关系,所以最后输出的uname的值都是不一样的!

class A{
	public $uname;
}
$a = new A();
$a->uname = 100;
echo $a->uname.'<br/>';//100
$b = new A();
$b->uname = 200;
echo $b->uname;//200

利用static关键词,创建一个静态的方法,然后通过类本身去创建对象,那么最后不管定义多少个变量,这几个变量所指向的对象都是同一个对象,也就是同一个内容地址,这样可以节省内存空间。

如下代码:因为使用了static关键词定义了属性obj,所以它只会初始化一次,getObj方法里边的if判断语句也只会执行一次,最后return出的对象都是同一个对象!

class A{
	public $uname;
	static $obj = null;
	public function __construct(){
		echo '100'.'<br/>';
	}
	public function show(){
		echo $this->uname;
	}
	static function getObj(){
		if(is_null(self::$obj)){
			self::$obj = new A();
		}
		return self::$obj;
	}
}

$a = A::getObj();
$a->uname = 200;
echo $a->uname.'<br/>';//200
$b = A::getObj();
echo $b->uname.'<br/>';//200
$b->uname = 300;
echo $b->uname.'<br/>';//300
echo $a->uname.'<br/>';//300

需要注意的是:如果对象是通过new关键字创建的,那么类里边的默认函数__construct就必须得是public状态,否则创建对象的同时执行马上会执行这个构造函数,但是定义成private私有的,那就不允许访问,导致出错!

class A{
	private function __construct(){
		echo 123;
	}
}
$a = new A();//报错
微信二维码
锐壳主机