Buongiorno. Sono un nuovo utente e da non molto tempo mi sono avvicinato alla programmazione
OOP in php (programmazione che non conoscevo in nessun altro linguaggio). Sto sviluppando un
progetto didattico per la mia scuola e avrei necessità di implementare una classe Singleton
da utilizzare come classe padre ogni volta che ne ho bisogno.
Avrei elaborato una soluzione che, almeno in apparenza, sembra corretta ma quando vado a provarla
semplicemente non mi visualizza niente.
Questa soluzione utilizza un interfaccia molto semplicemente perchè sono fresco di studi e mi piace seguire
le regole mentre la scelta di implementare la classe Singleton come astratta è dovuta al fatto che effettivamente
non dovrà mai essere creata una sua istanza.
file: interface.ISingleton.php
Codice PHP:
<?php
// Implementazione dell'interfaccia
interface ISingleton
{
final public static function getInstance();
public function destroyInstance();
}
?>
file: abstract.Singleton.php
Codice PHP:
<?
require_once 'interface.ISingleton.php';
abstract Singleton implements ISingleton
{
/**
* Contiene l'istanza
*
* @var array
*
*/
private static $_instanceOfClass;
/**
*
* Costruttore protetto
*
*/
protected function __construct()
{
}
/**
*
* Impedisco la clonazione del Singleton
*
*/
public function __clone()
{
trigger_error ( 'La clonazione di un oggetto Singleton non è abilitata', E_USER_ERROR );
}
/**
*
* Metodo Singleton
*
* @return L'istanza del oggetto
*
*/
public static function getInstance()
{
if ( !isset ( self::$_instanceOfClass[ get_called_class() ]))
{
$c = get_called_class();
self::$_instanceOfClass = new $c;
}
return self::$_instanceOfClass;
}
/**
*
* Distruggo il Singleton quando non mi serve più
*
*/
public function destroyInstance()
{
unset ( self::$instanceOfClass[ get_class($this) ]);
}
/**
*
* Distruttore
*
*/
public function __destruct()
{
unset ( self::$_instanceOfClass );
}
}
?>
file: class.ClasseFiglia.php
Codice PHP:
<?
require_once 'abstract.Singleton.php';
// Classe fittizia di prova
class ClasseFiglia extends Singleton
{
// Variabili membro
/** ............................. */
// Costruttore
protected function __construct()
{
/** ... implementazione ... */
}
// Metodo di prova
public function sayHello()
{
echo "Ciao Mondo!";
}
}
// Utilizzo
// Creo l'istanza della classe ClasseFiglia se già non esistente
$classeFiglia = ClasseFiglia::getInstance();
// Uso il metodo della classe figlia
$classeFiglia->sayHello();
?>
Qualche suggerimento ?
Grazie per le risposte