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