什么是面向对象?面向对象的简单了解!返回列表
上传时间: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-fpm 基础介绍
- 下一篇:COOKIE、SESSION之彻底搞定!