Ho un metodo singleton, ogni volta che viene chiamato con i parametri input (può essere id intero o una stringa che nel mio caso è un codice alfanumerico) e il database, deve istanziare in base a ciò che ho passato da input.
Dichiarazione della classe
codice:class wbmTableOggetti extends JTable { ppublic $nomiDeicampi, .....; public function __construct( & $db, $id=0 ) { //il costruttore è sempre istanziato con id (intero) parent::__construct( '#__wbm_oggetti', 'id', $db ); if ($id) $this->load( $id ); else $this->cdata = date('Y-m-d H:i:s'); }
Singleton per istanziare gli oggetti con id (intero)
codice:public function getInstance( & $db, $id = 0) { static $istanze; if (!isset($istanze)) { $istanze = array(); } if (empty($istanze[$id])) { $ist = new wbmTableOggetti( $db, $id ); $istanze[$id] = $ist; } return $istanze[$id]; }
Singleton con input (che può essere un intero quindi prende l'id oppure se stringa è il codice)
ho provato a fare cosi
non mi sembra una soluzione buona, ho verificato per alcuni casi e funziona, ma non penso che sia abbastanza robusto da prendere in considerazione casi particolari.codice:public function getInstance( & $db, $input = "") { static $istanze; if (!isset($istanze)) { $istanze = array(); } if ( is_string($input) ) // se input è una stringa (cioè codice) { if (empty($istanze[$input])) //ed in precedenza non è stato già caricato un istanza { if ( is_null ($this->_messaggio)) { $query = "SELECT codice,oggetto,testo FROM #__wbm_Oggetti WHERE codice LIKE '" . $input ."'"; $this->_db->setQuery( $query ); $istanze[$input] = $this->_db->loadObjectList(); // codice è la chaive $this->_messaggio = $istanze[$input]; // oggetto (codice,testo,oggetto del msg) } } } else { if (empty($istanze[$input])) { $ist = new wbmTableOggetti( $db, $input ); $istanze[$input] = $ist; //id è la chiave } } return $istanze[$input]; }
Consigli per migliorare o una soluzione più compatta e robusta?
Grazie in anticipo

Rispondi quotando
