PHP面向对象单例演示
/* 单例模式
先看
注:单例常用也常考,请认真练习
*/
/*
第一步:一个普通的类
这个普通类,可以new 来实例化
这显然不是单例
class single {
}
$sing1=new single();
$sing2=new single();
$sing3=new single();
*/
/*
第二步:看来new是罪恶之源,干脆不让new 了
我们把构造方法 保护/私有,外部不能new了
---担引出一个问题,不能new,得不到对象,这个不是单例,这个0例
class single {
protected function __construct(){
}
}
$single=new single();
*/
/*
第三步,通过内部的static 方法来调用
class single {
protected $hash; // 随机码
protected function __construct(){
$this->hash = mt_rand(1,99966);
}
static public function getSingle() {
return new single();
}
}
$single1=single::getSingle();
$single2=single::getSingle();
var_dump($single1);
var_dump($single2);
两个对象什么时间相等?
答:只有指向一个对象地址的时候 */
// 第四步,通过内部的static 方法实例化,并且,把实例保存在内部的静态属性上
class single {
protected $hash;
static protected $str=NULL;
protected function __construct(){
$this->hash = mt_rand(1,666);
}
static public function getSingle(){
if (self::$str instanceof self) { //instance 实例of谁的
return self::$str; //专门判断某个对象是不是某个类的实例用的
}
self::$str=new single();
return self::$str;
}
}
$single1=single::getSingle();
$single2=single::getSingle();
var_dump($single1);
var_dump($single2);
if ($single1==$single2) {
echo '是同一个对象';
} else {
echo '不是同一个对象';
}
echo '<hr />';
//问题来了
class test extends single {
function __construct(){
parent::__construct();
}
}
$test1=new test();
$test2=new test();
var_dump($test1);
var_dump($test2);
//问题1:我们辛苦写的单例,继承一下就不灵了
/*
解决 final 最终的
这个关键词在PHP中,可以修改类,方法名,但不能修饰属性
final 修饰类,则此类,不能被继承
final 修饰方法,此方法不影响继承,但是此方法 不允许重写
*/
/* class Human {
final public function say() {
echo '我是中国人!';
}
public function show() {
echo 'hello world';
}
}
class wHuman extends Human {
}
class minman extends wHuman {
public function say() {
echo '你好吗';
}
}
*/
// final 解决继承更改属性方法问题
Dcr163的博客
http://dcr163.cn/32.html(转载时请注明本文出处及文章链接)