... esempio singleton ... PHP 5
codice:
class MySQL {
static private $_mysql; // istanza
static private $_connection; // connessione
// parametri connessione
private $_host,
$_db,
$_user,
$_pass
;
// parametri alla prima chiamata, poi non necessari
static public function getInstance($host = '', $db = '', $user = '', $pass = ''){
return isset(self::$_mysql) ? self::$_mysql : (self::$_mysql = new self($host, $db, $user, $pass));
}
// costruttore, una volta sola
private function __construct($host, $db, $user, $pass){
self::$_connection = mysql_connect($host, $user, $pass);
mysql_select_db($db, self::$_connection);
$this->_host = $host;
$this->_db = $db;
$this->_user = $user;
$this->_pass = $pass;
}
// no clone
public function __clone(){
throw new Exception('non puoi farlo');
}
// chiudi connessione se distrutto (e non era stato deserializzato)
public function __destruct(){
if(is_resource(self::$_connection))
mysql_close(self::$_connection);
}
// cosa salvi se serializzato
public function __sleep(){
return array('_host', '_db', '_user', '_pass');
}
// cosa fai al wakeup ... sempre sinlgeton, oggetto diverso, connessione sempre uguale
public function __wakeup(){
self::getInstance($this->_host, $this->_db, $this->_user, $this->_pass);
}
// esempio layer per query
public function query($sql){
return mysql_query($sql, self::$_connection);
}
}
... qualche test ...
codice:
$a = MySQL::getInstance('localhost:3307', 'test', 'root', '');
$b = MySQL::getInstance();
echo '<pre>';
var_dump($b === $a);
$c = unserialize(serialize($b));
var_dump($c);
// $d = clone $c; // errore
$q = $c->query('SELECT 123');
while($row = mysql_fetch_row($q))
echo $row[0]."\n";
echo '</pre>';
sarebbe piu' sicuro e corretto usare un metodo crypt e decrypt in serializzazione per evitare di esporre dati sensibili qualora si voglia serializzare un singleton.
La serializzazione in questo caso genera un'istanza differente (normale comportamento della de-serializzazione) ma almeno e' possibile salvare una singleton (diciamo che e' solo un esempio per mostrare alcuni concetti base di PHP 5 ... da studiare, piu' che da usare)