• 微信:
  • hai764003
  • QQ:
  • 511211014
  • E-mail:
  • jaquery@163.com

案例总数51

访问总数312364

收藏总数310895

什么是面向对象?面向对象的简单了解!返回列表

上传时间:2015-02-02 内容关键字:什么是面向对象?面向对象的简单了解!


三、单例模式:


1. 单例模式引入和完成:


第一步:一个普通的类可以new来实例化,这显然不是单例。

class single{  }

$single = new single();


第二部:防止类外实例化new。看来new是罪恶之源,干脆不让new了。

class single{

protected function __construct(){}

}

我们把构造方法protected/private的话,外部就不能new了。

但引出一个问题:不能new的话,那得不到对象这也不是单例呀,是“0例模式”了?


第三部:实例化对象在类内进行。不能在外部实例的原因是__construnct()实例化的时候会被自动的 外部调用,但是如果protected的话,外部是不能调用的,但是我们内部调用的话就不存 在上述问题了。

class single{

protected function __construct(){}

public function getInstance(){

return new self();

}

}


第四部:类内实例化后,静态调用静态方法。通过内部的static方法来调用,没有对象的话它依旧 可以发回作用,因为它不依赖对象。

class single{

public $hash; //随机码,用它来检测,两次调用单例后,是不是用的统一随机码

protected function __construct(){

$this->hash = mt_rand(1,9999);

}

static public function getInstance(){

return new self();

}

}

$s1 = single::getInstance();

$s2 = single::getInstance();

问题:两个对象什么时候相等?可以print一下来看看?

答案:只有指向同一个对象地址的时候,才能相等。


但是,你每single::getInstance()一次,内部又实例化一次,还是无法得到$s1=$s2,让所有 的对象指向同一个对象。


第五步:通过内部的static方法实例化,并且把实例化保存在类内部的静态属性上。判断实例有没 有存在,如果不在则创建,存在则直接返回.单例基本完成!

class single{

public $hash; //随机码,用它来检测,两次调用单例后,是不是用的统一随机码

static protected $ins = null;

protected function __construct(){

$this->hash = mt_rand(1,9999);

}

static public function getInstance(){

//instance实例,of谁的,专门判断某个对象是不是某个类的实例用的。

if(self::$ins instanceof self){   //对象obj instanceof  类名

return self::$ins;

}

self::$ins = new self();

return $ins;

}

}

$s1 = single::getInstance();

$s2 = single::getInstance();

这个时候就完成了$s1 = $s2;


第六步:继承上面的单例模式:

class test extends single{

public function __construct(){

parent::__construct();

}

}

$t1 = new test();

$t2 = new test();

问题:我们辛苦些的单例,继承一下就不灵了。

答案:出现这个情况的主要原因,是因为子类继承了父类以后,重写了父类的构造方法后   让子类再次可以new了,所以我们不让子类重写父类的构造方法,可以解决这个 问题。final关键字。


第七部:防止子类重写父类的构造函数。我们可以在用final修饰构造函数:

class single{

static protected $ins = null;

final protected function __construct(){

}

static public function getInstance(){

//instance实例,of谁的,专门判断某个对象是不是某个类的实例用的。

if(self::$ins instanceof self){   //对象obj instanceof  类名

return self::$ins;

}

self::$ins = new self();

return $ins;

}

}

class t extends s{

这个类里是不能重写父类的构造函数的

}

$t1 = t::getInstance();

$t2 = t::getInstance();


 

小海哥推荐你看: 博客园  php教程分享网站  phpmywind  脚本之家