php库包,超轻的PHP数据库工具包

namespace Persistence\DbAccess;

use InvalidArgumentException, BadMethodCallException;

use PDO, PDOException;

/**

* 连接工厂,提供全局的PDO对象,并管理事务。

*

* @version 0.3

* @author tonyseek

* @link http://stu.szu.edu.cn

* @license http://www.opensource.org/licenses/mit-license.html

* @copyright StuCampus Development Team, Shenzhen University

*

*/

final class Connection

{

/**

* Connector 实例集合

*

* @var array

*/

static private $instances = array();

/**

* 数据库驱动名

*

* @var string

*/

private $driver = '';

/**

* 数据库连接字符串(Database Source Name)

*

* @var string

*/

private $dsn = '';

/**

* PDO 实例

*

* @var \PDO

*/

private $pdo = null;

/**

* 用户名

*

* @var string

*/

private $username = '';

/**

* 密码

*

* @var string

*/

private $password = '';

/**

* 是否开启持久连接

*

* @var bool

*/

private $isPersisten = false;

/**

* 是否开启仿真预编译

*

* @var bool

*/

private $isEmulate = false;

/**

* 是否在事务中

*

* @var bool

*/

private $isInTransation = false;

/**

* 私有构造函数,阻止外部使用 new 操作符实例化

*/

private function __construct(){}

/**

* 生产 Connector 实例(多例)

*

* @param string $name

* @return \StuCampus\DataModel\Connector

*/

static public function getInstance($name = 'default')

{

if (!isset(self::$instances[$name])) {

// 如果访问的实例不存在则抛出错误异常

throw new InvalidArgumentException("[{$name}] 不存在");

}

return self::$instances[$name];

}

/**

* 断开所有数据库实例的连接

*/

static public function disconnectAll()

{

foreach (self::$instances as $instance) {

$instance->disconnect();

}

}

/**

* 添加数据库

*

* 向实例群添加 Connector

*

* @param string $name 标识名

* @param string $driver 驱动名

* @param string $dsn 连接字符串

* @param string $usr 数据库用户名

* @param string $pwd 数据库密码

* @param bool $emulate 仿真预编译查询

* @param bool $persisten 是否持久连接

*/

static public function registry($name, $driver, $dsn, $usr, $pwd, $emulate = false, $persisten = false)

{

if (isset(self::$instances[$name])) {

// 如果添加的实例名已经存在则抛出异常

throw new BadMethodCallException("[{$name}] 已被注册");

}

// 实例化自身,并推入数组中

self::$instances[$name] = new self();

self::$instances[$name]->dsn = $driver . ':' . $dsn;

self::$instances[$name]->username = $usr;

self::$instances[$name]->password = $pwd;

self::$instances[$name]->driver = $driver;

self::$instances[$name]->isPersisten = (bool)$persisten;

self::$instances[$name]->isEmulate = (bool)$emulate;

}

/**

* 获取 PHP Database Object

*

* @return \PDO

*/

public function getPDO()

{

if (!$this->pdo) {

// 检查 PDO 是否已经实例化,否则先实例化 PDO

$this->pdo = new PDO($this->dsn, $this->username, $this->password);

// 错误模式为抛出 PDOException 异常

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 开启查询缓存

$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $this->isEmulate);

// 开启持久连接

$this->pdo->setAttribute(PDO::ATTR_PERSISTENT, $this->isPersisten);

}

return $this->pdo;

}

/**

* 获取数据库驱动名

*

* @return string

*/

public function getDriverName()

{

return $this->driver;

}

/**

* 开始事务

*/

public function transationBegin()

{

$this->isInTransation = $this->getPDO()->beginTransaction();

}

/**

* 提交事务

*/

public function transationCommit()

{

if ($this->isInTransation) {

$this->getPDO()->commit();

} else {

trigger_error('transationBegin 应该先于 transationCommit 调用');

}

}

/**

* 回滚事务

* @return bool

*/

public function transationRollback()

{

if ($this->isInTransation) {

$this->getPDO()->rollBack();

} else {

trigger_error('transationBegin 应该先于 transationRollback 调用');

}

}

/**

* 连接是否在事务中

*

* @return bool

*/

public function isInTransation()

{

return $this->isInTransation;

}

/**

* 在事务中执行回调函数

*

* @param function $callback 匿名函数或闭包函数

* @param bool $autoRollback 异常发生时是否自动回滚

* @throws \PDOException

* @return bool

*/

public function transationExecute($callback, $autoRollback = true)

{

try {

// 开始事务

$this->transationBegin();

// 调用回调函数

if (is_callable($callback)) {

$callback();

} else {

throw new InvalidArgumentException('$callback应该为回调函数');

}

// 提交事务

return $this->transationCommit();

} catch(PDOException $pex) {

// 如果开启了自动回滚, 则捕捉到 PDO 异常时先回滚再抛出

if ($autoRollback) {

$this->transationRollback();

}

throw $pex;

}

}

/**

* 安全地断开数据库连接

*/

public function disconnect()

{

if ($this->pdo) {

// 检查 PDO 是否已经实例化,是则设置为null

$this->pdo = null;

}

}

/**

* 阻止克隆

*/

public function __clone()

{

trigger_error('被阻止的 __clone 方法, Connector 是单例类');

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值