PHP 设计模式之 — 单例模式

本文详细阐述了PHP中单例模式的核心实现及其在数据库连接控制和球队管理场景的应用,通过实例展示了如何确保类的唯一实例,并提供公共访问方法。同时,通过代码示例说明了单例模式在实际开发中的作用与优势。
PHP单例模式实现的核心注意一下几点:
 
   1.   需要一个保存类的唯一实例的静态成员变量(通常为$_instance私有变量)
 
  2.   构造函数和克隆函数必须声明为私有的,这是为了防止外部程序new类从而失去单例模式的意义
 
  3.   必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从而返回唯一实例的一个引用
   4.   单例类只能有一个实例,单例类必须自己创建自己的唯一的实例,单例类必须给所有其他对象提供这一实例


 <?php
/**   
 * Description: 数据库连接职责中的集中控制
 * @author Mr Lv   
 * @date 2011-11-25  
 */ 
class Database {
	
	private static $_instance = NULL;
    //私有构造函数可以防止外部代码使用new来创建对象
	private function __construct() {
		echo "执行sql语句"."<br>";
	}

	public static function getInstance() {
		if (! self::$_instance instanceof self) { //self是指向当前类的指针
			self::$_instance = new self();	
		}
		return self::$_instance;
	}
    //魔术方法消除了PHP语言可以复制对象从而破坏单一职责的一个漏洞
	private function __clone(){
	
	}
	public function querySql($id) {
		echo "select * from table where id =".$id."<br>";
	}
}
$db = Database::getInstance();
$db->querySql(1);
$db = Database::getInstance();
$db->querySql(2);
?>  

页面结果:
执行sql语句
select * from table where id =1
select * from table where id =2


(__construct()函数只执行一次)


自己写了一个实例

<?php 
/**    
 * Description: 世界上只有一只伟大的巴塞罗那球队
 * @author Mr Lv    
 * @date 2011-11-25   
 */    
class Barcelona {

	private static $instance = NUll;
    //队员名字
	private $player;
    //队员人数
	private $playerNum = 0;
    //假设球队最多能买11人
	public $maxNum = 11;
	//记录球队都谁
	private $ballTeam  = array();

	private function __construct() {
	}
	
	private  function  __clone() {
	}
	public static function getInstance() {
		if (!self::$instance instanceof Barcelona ){
			self::$instance=new Barcelona();
		}
		return self::$instance;
	}
	
	/**
     * 购买队员
     */  
	public function buyPlayer($player) {
		if ($this->playerNum > $this->maxNum) {
			exit ('巴塞罗那球队已经满员!!!');
		}
		if (!empty($player)) {
			//球场装载球员
			array_push($this->ballTeam, $player);
			$this->playerNum += 1;
		} else {
			exit ('请报上你的名字!!!');
		}
	}
	/**
     * 目前球队都有谁
     */  
	public function presentPlayer () {
		return $this->ballTeam;
	}
}
echo "目前巴塞罗那正在招兵买马征战欧冠:<br><br>";
$barce = Barcelona::getInstance();//因为只有巴塞罗那球队,所以只有一个实例
echo "梅西想加入巴塞罗那";
$barce->buyPlayer("梅西");
echo "<br>目前球队拥有:<br>";
foreach ($barce->presentPlayer() as $teamer) {
	echo $teamer.'<br>';
}
echo "<br>比利亚想加入巴塞罗那<br>";
$barce->buyPlayer("比利亚");
echo "<br>目前球队拥有:<br>";
foreach ($barce->presentPlayer() as $teamer) {
	echo $teamer.'<br>';
}
echo "<br>伊涅斯塔想加入巴塞罗那<br>";
$barce->buyPlayer("伊涅斯塔");
echo "<br>目前球队拥有:<br>";
foreach ($barce->presentPlayer() as $teamer) {
	echo $teamer.'<br>';
}

echo "<br><br>哈维想加入皇家马德里,<br>";
$barceA = Barcelona::getInstance();//因为只有巴塞罗那球队,所以只有一个实例(就没有皇家马德里)
$barceA->buyPlayer("哈维");
echo "<br>目前球队拥有:<br>";
foreach ($barce->presentPlayer() as $teamer) {
	echo $teamer.'<br>';
}
?> 

页面结果:

目前巴塞罗那正在招兵买马征战欧冠:

梅西想加入巴塞罗那
目前球队拥有:
梅西

比利亚想加入巴塞罗那

目前球队拥有:
梅西
比利亚

伊涅斯塔想加入巴塞罗那

目前球队拥有:
梅西
比利亚
伊涅斯塔


哈维想加入皇家马德里,

目前球队拥有:
梅西
比利亚
伊涅斯塔
哈维


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值