Sto lavorando in un framework di app Web e parte di esso consiste in un numero di servizi, tutti implementati come singleton. Tutti estendono una classe di servizio, in cui viene attuato il comportamento Singleton, cercando qualcosa di simile:Estensione di singleton in PHP
class Service {
protected static $instance;
public function Service() {
if (isset(self::$instance)) {
throw new Exception('Please use Service::getInstance.');
}
}
public static function &getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
Ora, se ho una classe chiamata FileService implementata in questo modo:
class FileService extends Service {
// Lots of neat stuff in here
}
... chiamando FileService :: getInstance() non genererà un'istanza di FileService, come lo voglio io, ma un'istanza di Servizio. Presumo che il problema qui sia la parola chiave "self" utilizzata nel costruttore del servizio.
C'è qualche altro modo per ottenere ciò che voglio qui? Il codice singleton è solo poche righe, ma vorrei comunque evitare ogni ridondanza di codice ogni volta che posso.
FYI: Questo codice utilizza [ 'get_called_class'] (http://us2.php.net/manual/en/function.get-called-class.php), aggiunto in PHP 5.3. Fare questo nelle versioni precedenti è un po 'più complicato. – Charles
Grazie Charles, ho aggiornato la risposta per risolverlo. –
Holy Yikes, è spaventoso. Immagina di chiamare 'getInstance' una dozzina di volte, cioè una dozzina di aperture e una dozzina di letture del file di classe. – Charles