PHP设计模式 之 单例模式(封装PDO)

1、单例模式

单例模式:singleton,是一种类的设计只会最多产生一个对象的设计思想。单例模式的目的是为了保护资源的唯一性

  • 单例模式为了解决如何只产生一个对象,需要使用以下解决方案,简称三私一公
    • 私有化构造方法:不让在外部产生多个对象
    • 私有化克隆方法:不允许对象被克隆产生新对象
    • 公有化静态方法:运行进入类内部产生对象
    • 私有化静态属性:保存已经产生的对象

实例:

<?php

// 1、首先定义一个空类,叫做Singleton
class Singleton {

    // 2、对象的产生是通过实例化产生的,而实例化是一种不可控行为,即可以产生无限多个对象,
    // 所以应该禁止:即”禁止实例化“,之所以是引号,是因为只能禁止在类外部实例化对象,私有化构造方法
    private function __construct(){  echo 'hello word';  }

    // 3、一旦外部不能实例化对象了,那就意味着根本“不可能”产生对象了,此时就只能想办法
    // 在还没有产生对象的时候就进入到“类内部”,意味着只能通过`静态方法`让类直接进入到类的内部
    public static function getInstance(){
        // 4、进入类的内部依然还是没有对象,此时需要在静态方法内部进行对象实例化,
        // 并且把得到的对象返回到外部
        // return new self();

        # 判断内部属性是否存在对象(is_object函数):最好的判定是存的对象是当前类的 instanceof
        if(!(self::$object instanceof self)){
            # 当前保存的内容不是当前类的对象
            self::$object = new self();
        }
        
        # 返回对象给外部
        return self::$object;
  
    }

    // 5、第4部开启了实例化对象的窗口,但是此时新问题出现:无限调用静态方法依然可以得到多个对象。
    // 如果想要该方法只返回一个对象,就得保证类内部有办法存着某个产生的对象,第一次产生新的,后面返回旧的。此时需要使用静态属性
    // 5.1 增加静态属性:私有,不允许外部修改,否则外部修改之后就没有意义了
    private static $object = NULL;		# 初始化为NULL,没有对象
    //  5.2 判断第三步内部属性是否存在对象(is_object函数):最好的判定是存的对象是当前类的 instanceof,
    // 即根据 $objec 修改函数getInstance()中的返回的内容

    // 6、此时可以保证外部无论多少次调用公有静态方法获取实例,都会只得到一个对象。但是此时外部对象依然可以产生新的对象:
    // 因为克隆,所以还必须禁止对象的克隆,即在类内部私有化克隆方法
    private function __clone(){}
}

// 尝试外部实例化
// $demo = new Singleton();    //报错
// 外部获取对象
$s = Singleton::getInstance();
使用单例模式PDO连接数据库
<?php
/**
 * PDO-MySQL数据库操作类
 */
class MySQLPDO{
	//数据库默认连接信息
	private $dbConfig = array(
		'db'   => 'mysql', //数据库类型
		'host' => 'localhost', //服务器地址
		'port' => '3306', //端口
		'user' => 'root', //用户名
		'pass' => 'weicunbin123', //密码
		'charset' => 'utf8', //字符集
		'dbname' => 'testguest', //默认数据库
	);
	//单例模式 本类对象引用
	private static $instance;
	//PDO实例
	private $db;
	/**
	 * 私有构造方法
	 * @param $params array 数据库连接信息
	 */
	private function __construct($params){
		//初始化属性
		$this->dbConfig = array_merge($this->dbConfig,$params);
		//连接服务器
		$this->connect();
	}
	/**
	 * 获得单例对象
	 * @param $params array 数据库连接信息
	 * @return object 单例的对象
	 */
	public static function getInstance($params = array()){
		if(!self::$instance instanceof self){
			self::$instance = new self($params);
		}
		return self::$instance; //返回对象
	}
	/**
	 * 私有克隆
	 */
    private function __clone() {}
	/**
	 * 连接目标服务器
	 */
	private function connect(){
		try{
			//连接信息
			$dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};port={$this->dbConfig['host']};dbname={$this->dbConfig['dbname']};charset={$this->dbConfig['charset']}";
			//实例化PDO
			$this->db = new PDO($dsn,$this->dbConfig['user'],$this->dbConfig['pass']);
			//设定字符集
			$this->db->query("set names {$this->dbConfig['charset']}");
			echo 1;
		}catch (PDOException $e){
			//错误提示
			die("数据库操作失败:{$e->getMessage()}");
		}
	}
	/**
	 * 执行SQL
	 * @param $sql string 执行的SQL语句
	 * @return object PDOStatement
	 */
	public function query($sql){
		$rst = $this->db->query($sql);
		if($rst===false){
			$error = $this->db->errorInfo();
			die("数据库操作失败:ERROR {$error[1]}({$error[0]}): {$error[2]}");
		}
		return $rst;
	}
	/**
	 * 取得一行结果
	 * @param $sql string 执行的SQL语句
	 * @return array 关联数组结果 
	 */
	public function fetchRow($sql){
		return $this->query($sql)->fetch(PDO::FETCH_ASSOC);
	}
	/**
	 * 取得所有结果
	 * @param $sql string 执行的SQL语句
	 * @return array 关联数组结果 
	 */
	public function fetchAll($sql){
		return $this->query($sql)->fetchAll(PDO::FETCH_ASSOC);
	}
	public function demo(){
		echo '测试内容';
	}
}

// // 调用方式
// // 连接数据库
// $pdo = MySQLPDO::getInstance();
// // 调用方法
// $pdo -> demo()


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 PHP PDO 封装的示例: ```php class Database { private $host = "localhost"; private $user = "username"; private $password = "password"; private $database = "database"; private $charset = "utf8mb4"; private $pdo; public function __construct() { $dsn = "mysql:host={$this->host};dbname={$this->database};charset={$this->charset}"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; $this->pdo = new PDO($dsn, $this->user, $this->password, $options); } public function query($sql, $params = []) { $stmt = $this->pdo->prepare($sql); $stmt->execute($params); return $stmt; } public function fetchAll($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetchAll(); } public function fetch($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetch(); } public function insert($table, $data) { $keys = array_keys($data); $values = array_values($data); $placeholders = implode(',', array_fill(0, count($values), '?')); $sql = "INSERT INTO $table (" . implode(',', $keys) . ") VALUES ($placeholders)"; $this->query($sql, $values); return $this->pdo->lastInsertId(); } public function update($table, $data, $where) { $set = []; $values = []; foreach ($data as $key => $value) { $set[] = "$key = ?"; $values[] = $value; } $sql = "UPDATE $table SET " . implode(',', $set) . " WHERE $where"; return $this->query($sql, $values)->rowCount(); } public function delete($table, $where) { $sql = "DELETE FROM $table WHERE $where"; return $this->query($sql)->rowCount(); } } ``` 这个封装PDO,包含了常用的查询操作,如 query、fetchAll、fetch,以及增删改操作,如 insert、update、delete。你可以根据自己的需要进行扩展。使用时,只需要实例化这个,并调用相应的方法即可。例如: ```php $db = new Database(); $rows = $db->fetchAll("SELECT * FROM table WHERE id = ?", [1]); ``` 这个示例会查询一个 ID 为 1 的记录,并返回一个数组。你可以根据需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值