Code : Tout sélectionner
<?php
abstract class DBFactory
{
private static $pdo;
private static $mysqli;
public static function getPDO()
{
if (!(self::$pdo instanceof PDO)):
echo 'création d\'une instance de PDO<br />';
self::$pdo = new PDO('mysql:host=localhost;dbname=Test', 'user', 'pwd');
self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
endif;
return self::$pdo;
}
public static function getMySQLi()
{
if (!(self::$mysqli instanceof MySQLi)):
echo 'création d\'une instance de mysqli';
self::$mysqli = new mysqli('localhost', 'user', 'pwd', 'Test');
endif;
return self::$mysqli;
}
public static function closePDO()
{
if (self::$pdo instanceof PDO):
self::$pdo = null;
endif;
}
public static function closeMySQLi()
{
if (self::$mysqli instanceof MySQLi):
self::$mysqli->close();
self::$mysqli = null;
endif;
}
public static function getStatus()
{
yield (self::$pdo instanceof PDO) . '<br />';
yield (self::$mysqli instanceof MySQLi) . '<br />';
return;
}
}
echo "essai 1:<br />";
$pdo = DBFactory::getPDO();
$mysqli = DBFactory::getMySQLi();
var_dump($pdo, $mysqli); // "création d'une instance de PDO", "création d'une instance de mysqli" 2 objets ok
echo 'status :<br />';
foreach(DBFactory::getStatus() as $status):
echo $status; // pdo = 1, mysqli = 1
endforeach;
echo "<br />essai 2:<br />";
$pdo = DBFactory::getPDO();
$mysqli = DBFactory::getMySQLi();
var_dump($pdo, $mysqli); // no soucy
/**
* sleep(10) à cet endroit:
* mysql> SHOW PROCESSLIST;
+-----+------+-----------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------------+------+---------+------+----------+------------------+
| 139 | root | localhost:50218 | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 144 | root | localhost:50226 | test | Sleep | 4 | | NULL |
| 145 | root | localhost:50227 | test | Sleep | 4 | | NULL |
+-----+------+-----------------+------+---------+------+----------+------------------+
* 2 connexions sont ouvertes (je compte pas le query...)
**/
echo 'essai 3: fermeture des connexions';
DBFactory::closeMySQLi();
/**
* sleep(10) à cet endroit:
* mysql> SHOW PROCESSLIST;
*
+-----+------+-----------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------------+------+---------+------+----------+------------------+
| 139 | root | localhost:50218 | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 146 | root | localhost:50230 | test | Sleep | 3 | | NULL |
+-----+------+-----------------+------+---------+------+----------+------------------+
* la connexion mysqli est bien fermée
**/
DBFactory::closePDO();
/**
* sleep(10) à cet endroit:
* mysql> SHOW PROCESSLIST;
*
+-----+------+-----------------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------+-----------------+------+---------+------+----------+------------------+
| 139 | root | localhost:50218 | NULL | Query | 0 | starting | SHOW PROCESSLIST |
| 148 | root | localhost:50235 | test | Sleep | 2 | | NULL |
+-----+------+-----------------+------+---------+------+----------+------------------+
* la connexion PDO est toujours ouverte
**/
var_dump($pdo, $mysqli); // pdo = object pdo, mysqli = Warning: var_dump(): Property access is not allowed yet in E:\... on line 76
echo 'status :<br />';
foreach(DBFactory::getStatus() as $status):
echo $status; // pdo = null, mysqli = null
endforeach;
echo 'essai 4: ($pdo = null, $mysqli->close()):<br />';
$pdo = DBFactory::getPDO();
$mysqli = DBFactory::getMySQLi();
var_dump($pdo, $mysqli); // "création d'une instance de pdo", "creation d'une instance de mysqli"
Je sais que c'est un peu tiré par les cheveux mais j'aimerais bien comprendre