<?php
/**
* 对象池模式
*/
/**
* MySQL 对象
* Class Mysql
*/
class Mysql
{
private $createAt;
public function __construct()
{
//sleep(1);
$this->createAt = date("Y-m-d h:i:s");
}
public function connect()
{
echo '<br>连接数据库</br>';
}
public function execute( $sql )
{
echo '<br>执行sql语句:'.$sql."<br/>";
}
}
/**
* mysql 对象池
* Class MysqlPool
*/
class MysqlPool{
private $occupiedWorker = [];
private $freeWorker = [];
//获取对象实例
public function getInstance() : Mysql
{
if(count($this->freeWorker))
{
$worker = array_pop($this->freeWorker);
}else{
$worker = new Mysql();
}
$this->occupiedWorker[spl_object_hash($worker)] = $worker;
return $worker;
}
//返回给对象池
public function dispose(Mysql $worker)
{
$key = spl_object_hash($worker);
if(isset($this->occupiedWorker[$key]))
{
unset($this->occupiedWorker[$key]);
$this->freeWorker[$key] = $worker;
}
}
//对象池实例数量
public function count()
{
return count($this->occupiedWorker) + count($this->freeWorker);
}
}
/**test**/
//对象池
$mysqlPool = new MysqlPool();
$mysql1 = $mysqlPool->getInstance();
$mysql1->connect();
$mysql1->execute("select * from table;");
var_dump($mysql1);
//使用完后完后,把实例交换给对象池
$mysqlPool->dispose($mysql1);
//再次使用
$mysql2 = $mysqlPool->getInstance();
$mysql2->connect();
$mysql2->execute("select * from table2;");
var_dump($mysql2);
var_dump($mysql2 === $mysql1);
//不返回 再次获取
$mysql3 = $mysqlPool->getInstance();
$mysql3->connect();
$mysql3->execute("select * from table3");
var_dump($mysql3);
var_dump($mysql3 === $mysql2);