单例模式

Jul 20, 2016


单例模式

之前也有用到过单例模式,但是想了想还是想把这些都记录下来,以免忘记,哈哈,没办法,谁让宝宝是个健忘的银嘞。。。。

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。以下代码显示了 PHP V5 中的一个数据库连接单元素。

单例类:

1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化。

2.拥有一个保存类的实例的静态成员变量

3.拥有一个访问这个实例化的公共静态方法(常用getInstance()方法进行实例化单例类,通过instance 操作符可以检测到类是否已经被实例化。

eg Singleton.php

	<?php
			class  db{
			
			private static $instance;
			private $link;
			private function __construct($hostname,$username,$pwd,$db){
				$this->link=mysql_connect($hostname,$username,$pwd);
				mysql_select_db($db,$this->link);
				//var_dump($this->link);
				if(!$this->link){
	             	die('Could not connect: ' . mysql_error());
				 }
			}
			private function __clone(){}  //防止被克隆
	
			public static function  getInstance($hostname,$username,$pwd,$db){
				if(!(self::$instance instanceof self)){
					self::$instance=new self($hostname,$username,$pwd,$db);
				}
				var_dump(self::$instance);
				return self::$instance;
		}
	
	        public function query ($query){  
	            $this->query=mysql_query($query,$this->link); 
	            return $this->query;
	 }
	 		 public function num_rows($query)
	
	    {
	    	$or=$this->query($query);
	        return $this->result = mysql_num_rows($or);
	
	    }
	
	
	}  
	
	$conn=db::getInstance("127.0.0.1",'root','','tpshop');
	$sql="select * from tp_attr";
	$a= $conn->num_rows($sql);
	var_dump($a);