TypechoJoeTheme

Dcr163的博客

统计

PHP面向对象单例模式笔记

2016-03-11
/
0 评论
/
776 阅读
/
正在检测是否收录...
03/11

<?php 

/*
单例模式
先看场景:
多人协同开发,都要调用Mysql的实例
 
如果用SVN知道,好多人一起开发,再提交各自的文件
A:
$mysql= new mysql();
$mysql->query()
测参通过
B:
$db=new mysql();
测试通过
...
...
 
两个人的代码要合到一块,如下
$mysql=new mysql();
$db=new mysql();
 
现在问题是存在了两个mysql的实例,而且每new一下,都要连接数据库
显然,一个页面呢,有一个mysql类的实例就够了
 
如何限制,让多人开发,无论你怎么操作,只能得到一个对象呢?
解决方法:单例模式
 
注:单例常用 也常考,多练习熟悉
 
 第一步,一个普通的类
 这个普通类,可以new来实例化
 这显然不是单例
class MySingle{
 
}
$single=new MySingle();
$single2=new MySingle();
$single3=new MySingle();
*/
 
 
/*
 第二步:看起来new是罪恶之源,干脆不让new了
 我们把构造方法    保护/私有
 外部不能new了
 --但引出一个问题,不能new,那得不到对象,这不是单例,压根就是0例了
 
 
 
class MySingle{
protected function __construct(){
}
 
public function GetNew(){
return new self();
}
}
 
$single=new MySingle();
*/
 
/*
第三步
可以通过内部的static关键字,来调用
 
class MySingle{
public $hash;
public function __construct(){
$this->hash=mt_rand(1,999);
 
}
static public function GetNew(){
return new self();
}
}
 
$Mysingle=MySingle::GetNew();
$Mysingle2=MySingle::GetNew();
 
两个对象什么时间相等?
--只有指向同一个对象的时候才相等
 
 
var_dump($Mysingle);
var_dump($Mysingle2);
//结果出来两个对象都不是指向同一个对象
 
/*
第四步,通过内部的static方法实例化,
并且,把实例保存在类内部的静态属性上
这样就实现了一个单例模式
 */
class MySingle{
public $hash; /*随机码*/
 
static protected $ins=null;
 
final protected function __construct(){
$this->hash=mt_rand(1,999);
}
static public function GetNew(){
if(self::$ins instanceof self){ //instanceof 判断某个对象是不是某个类的实例
return self::$ins;
}else{
self::$ins = new self();
return self::$ins; 
}
}
}
 
$Mysingle=MySingle::GetNew();
$Mysingle2=MySingle::GetNew();
/*
两个对象什么时间相等?
--只有指向同一个对象的时候才相等
 */
 
var_dump($Mysingle);
var_dump($Mysingle2);
//现在两个对象就是指向同一个对象了,单例模式初次完成
 
//现在有一个问题了
class SingSon extends Mysingle{
 
}
 
$singSon=SingSon::GetNew();
$singSon2=SingSon::GetNew();
var_dump($singSon);
var_dump($singSon2);
 
/*问题显示,继承之后单例模式就没用了
解决办法:final 最终的
final 关键词 在PHP中,可以修改类,方法名,但不能修改属性
*/
 
?>
朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

http://dcr163.cn/71.html(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. slot mpo terbaru
    2025-02-08
  2. Sherry Stockdill
    2025-01-28
  3. slot demo
    2025-01-13
  4. 陌天
    2025-01-09
  5. Kerrie Bostick
    2024-12-28

标签云