实现xml和json接口——单例模式的Db类(第二篇)

       上一篇只是实现了xml和json格式数据的类的封装,不过它是没有数据的来源的;因此,本篇文章是封装一个调用数据库数据的方法,视频里面用的是mysql_connect()等函数,不过现在用这些函数会出现notice,因为这些函数已经过时了,将来可能不会再用到;其实完全可以不写这个类,因为PHP自带的调用数据库数据的类很齐全了。可以用PDO,也可以用mysqli;PDO在我的理解里,他就是一个纯类,面向对象调用数据库;而mysqli就不清楚了,既可以用mysqli_的函数,亦可以new 一个mysqli对象调用数据库,它是mysql的增强版。下面是各种API连接MySQL服务器的过程,当然只是简单的流程:术语API和扩展描述的不是同一类事物,因为扩展可能并不需要暴露一个API接口给程序员。

实现xml和json接口——单例模式的Db类(第二篇)_第1张图片

       不过这里是实现一个单例模式的类!这个需要注意!什么叫单例模式?一个类只能拥有一个实例,它需要:
1、构造函数非public;
2、拥有一个保存类的静态变量;
3、拥有一个实例化类的公共静态方法;

这里我用mysqli_函数来实现这个单例模式,下面是连接数据库主要代码,这段代码也比较简单,但是需要考虑各种异常的情况,因为前端工程师不知道你写的什么,你需要将异常情况能够通俗易懂的形式显示出来。

一、数据库连接函数的实现:

public function connect(){
		if(!self::$_connectSource){
			self::$_connectSource = mysqli_connect(
			$this->_dbConfig['host'],
			$this->_dbConfig['user'],
			$this->_dbConfig['password']);
			
			//抛出数据库连接资源错误信息
			if((!self::$_connectSource)){
				throw new Exception('mysql connect error:'.mysqli_connect_error());
				//die('mysql connect error:'.mysqli_connect_error);
			}
			
			mysqli_select_db(self::$_connectSource,$this->_dbConfig['database']);
			mysqli_query(self::$_connectSource,"set names utf8");
		}

		return self::$_connectSource;
	}

第一点:数据库资源连接。将其赋值给一个静态变量,self::$_connectSource,如果是我,可能就直接写$conn = mysqli_connect()了;

第二点:抛出数据连接资源错误信息。使用throw new Exception('mysql connect error:'.mysqli_connect_error());Exception是PHP5之后的异常类,可以直接调用;参考这篇文章https://www.jb51.net/article/30561.htm;这里写这段代码的原因是后面可以try catch指出错误,方便前端理解。另外,对几个mysqli的异常函数做个比较:

mysqli_connect_error():返回一个用字符串描述的最近一次的数据库连接错误;

mysqli_connect_errno():返回最近一次数据库连接的错误代码;

mysqli_error():返回一个用字符串描述的最近一次的函数使用错误;

mysqli_errno():返回最近一次的函数使用错误;

因此,在代码优化方面是不是可以考虑在mysqli_query()函数使用错误时抛出一个异常?比如:

if(!mysqli_query(self::$_connectSource,"set names utf8")){
	throw new Exception('mysqli function error:'.mysqli_error());
};

第三点:为了不造成数据库连接资源的浪费,首先就需要判断一下是否已连接数据库,这一点对于我来说,的确很难去想到。

二、接下来重点,实现单例模式,其实就是instanceof使用;其次,这个函数返回的是一个实例!最后就是实现单例模式的三个条件:

1、构造函数非public;
2、拥有一个保存类的静态变量;
3、拥有一个实例化类的公共静态方法;

其中构造函数非public并没有怎么体现!

    /* 
	*实现单例化自身的方法
	*@param NULL
	*return string
	*/
	static public function getInstance(){
		if(!(self::$_instance instanceof self)){
			self::$_instance = new self();
		}
		
		return self::$_instance;
	}

三、从数据库中取出数据了,需要对其进行缓存,减少数据库服务器的负担,下一篇实现文件缓存类;

四、Db类实现,也可以在类中用mysqli类、PDO来实现。这里就不贴出来了。

'localhost',
	'user'=>'root',
	'password'=>'shapolang',
	'database'=>'test',
	);

	private function __construct(){
		
	}
	
	/* 
	*实现单例化自身的方法
	*@param NULL
	*return string
	*/
	static public function getInstance(){
		if(!(self::$_instance instanceof self)){
			self::$_instance = new self();
		}
		
		return self::$_instance;
	}
	
	/* 
    *mysqli函数封装连接数据库方法
	*@param NULL
    *return source
    */
	public function connect(){
		if(!self::$_connectSource){
			self::$_connectSource = mysqli_connect(
			$this->_dbConfig['host'],
			$this->_dbConfig['user'],
			$this->_dbConfig['password']);
			
			//抛出数据库连接资源错误信息
			if((!self::$_connectSource)){
				throw new Exception('mysql connect error:'.mysqli_connect_error());
				//die('mysql connect error:'.mysqli_connect_error);
			}
			
			mysqli_select_db(self::$_connectSource,$this->_dbConfig['database']);
			mysqli_query(self::$_connectSource,"set names utf8");
		}

		return self::$_connectSource;
	}
}

 

你可能感兴趣的:(interface)