Vi avevamo già spiegato cos’è e come si implementa un Singleton nell’articolo precedente, ora renderemo quella stessa classe persistente durante tutta la sessione dell’utente (ovvero sinchè l’utente chiuderà il browser.
Ovviamente nessun programmatore con un minimo di senno si diverte a reinventare l’acqua calda dunque utilizzeremo le sessioni già messe a disposizione da PHP.
Ricordiamo il codice d’esempio di un Singleton presentato nell’articolo precedente:
<?php
class Single {
private static $singleton = null;
private $var;
static function getInstance(){
if (Single::$singleton == null){
Single::$singleton = new Single();
}
return Single::$singleton;
}
function __construct(){
$this->var = rand();
}
function getVar(){
return $this->var;
}
}
$single = Single::getInstance();
echo "Primo get: ".$single->getVar()."<br />";
$single = Single::getInstance();
echo "Secondo get: ".$single->getVar()."<br />";
?>
Prima di tutto aggiungeremo in cima a questo sorgente (o prima quando necessario) il richiamo al metodo per avviare le sessioni in PHP
session_start()
In seguito andiamo ad operare su getInstance() facendo in modo che non controlli solo la propria variabile static ma che controlli anche in $_SESSION se c’è una sua istanza archiviata:
static function getInstance(){
if (Single::$singleton == null){
if (isset($_SESSION['single'])) {
Single::$singleton = $_SESSION['single'];
}
else {
Single::$singleton = new Single();
$_SESSION['single'] = Single::$singleton;
}
}
return Single::$singleton;
}
In questo modo se non c’è un’istanza di Single si cerca nelle sessioni prima di crearne una.
Ciò vuol dire che il Singleton di cui parliamo sarà persistente durante tutta una sessione relativamente ad un solo utente. Inoltre alla chiusura del browser il singleton verrà perso.
Le applicazioni di un sistema del genere potrebbero essere molteplici, un Singleton come questo potrebbe dare un punto di vista privilegiato (e favorevole) al programmatore per capire gli spostamenti dell’utente (per esempio sistemi di tracciamento e rilevazione dei ROI).
Ripubblico di seguito l’intero codice, buon divertimento!
<?php
session_start();
class Single {
private static $singleton = null;
private $var;
static function getInstance(){
if (Single::$singleton == null){
if (isset($_SESSION['single'])) {
Single::$singleton = $_SESSION['single'];
}
else {
Single::$singleton = new Single();
$_SESSION['single'] = Single::$singleton;
}
}
return Single::$singleton;
}
function __construct(){
$this->var = rand();
}
function getVar(){
return $this->var;
}
}
$single = Single::getInstance();
echo "Primo get: ".$single->getVar()."<br />";
$single = Single::getInstance();
echo "Secondo get: ".$single->getVar()."<br />";
?>