SingletonPattern
Da Php-faq.org.
QzPwZN <a href="http://znvrpxxxjnbq.com/">znvrpxxxjnbq</a>, [url=http://txfnovhfsocs.com/]txfnovhfsocs[/url], [link=http://mcafzfcisfii.com/]mcafzfcisfii[/link], http://qcnnxiledvss.com/
Indice |
[modifica] Cosa risolve e quando si applica
[modifica] Implementazione generica in Php
L'implementazione è banale:
class Singleton
{
public static $property = NULL;
private function __construct () {}
}
Si tratta solo di creare una classe non istanziabile (il metodo costruttore rimane privato) e con una sola variabile statica.
Usare la singleton quindi si riduce ad un semplice:
Singleton::$property = 'valore';
Questo garantisce che durante l'esecuzione usare la singleton significhi usare sempre e comunque la stessa classe.
Alcuni giudicano questa implementazione poco utile in quanto non permette di passare la singleton come parametro ad una funzione, questo limite puo' essere facilmente superato in uno dei seguenti modi:
my_func_that_wont_modify(Singleton::$property); // se la singleton non verrà modificata my_func_that_will_modify(&Singleton::$property); // se la singleton verrà modificata
Comunque è anche utile notare che nel caso la singleton custodisca una risorsa o una classe, passare la variabile `$property` con o senza `&` farà ben poca differenza, poichè la funzione avrà in ogni caso la possibilità di modificare `$property`.
[modifica] Esempio di un possibile uso
Esistono diverse implementazioni del pattern singleton.
Tuttavia quella che IMHO si presenta come la più versatile è questa:
class Singleton
{
private static $properties = array();
public function __construct () {}
public function setProperty($propertyName, $propertyValue)
{
self::$properties[$propertyName] = $propertyValue;
}
public function getProperty($propertyName)
{
return (isset(self::$properties[$propertyName]))
? self::$properties[$propertyName]
: false;
}
}
Che permette di sfruttare la singleton con un semplice:
$instance0 = new Singleton();
$instance1 = new Singleton();
$instance0->setProperty('my_string', 'my value');
echo $instance1->getProperty('my_string');
Questa classe si presta bene anche ad un uso più agevole con poche modifiche, infatti sostituendo il nome dei metodi `setProperty` con `__set` e `getProperty` con `__get`, si può sfruttare la classe anche in questo modo:
$instance0 = new Singleton(); $instance1 = new Singleton(); $instance0->my_string = 'my value'; echo $instance1->my_string;
Che risulta più intuitivo e semplice da scrivere.
