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
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];
}
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.
Consigli per migliorare o una soluzione più compatta e robusta?
Grazie in anticipo