Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [OOP][PHP5] Ereditare una classe Singleton

    Salve a tutti, devo scrivere alcune classi singleton ed invece di fare
    il copy/paste del classico metodo che restituisce l'istanza , vorrei
    che le classi ereditassero il metodo in questione da una classe padre.

    Il mio problema sta nel generalizzare il metodo getInstance, mi spiego
    meglio

    Codice PHP:
    class Singleton
      
    {
          protected static 
    $_instance null;

            public static function 
    getInstance()
            {
                    if(
    self::$_instance === null)
                    {
                            
    $class_name __CLASS__;//problema 
                            
                            
    self::$_instance = new $class_name();

                    }
                    return 
    self::$_instance;
            }

    }

    class 
    myClass extends Singleton
    {
        function 
    doStuff()
        {
        }


    $m = myClass::getInstance();
    $m->doStuff();

    E qui mi da errore:
    Fatal error: Call to undefined method Singleton::doStuff()
    Il che significa che $m è di tipo Singleton e non myCLass.

    Googlando ho trovato la soluzione

    Codice PHP:
      $class_name get_class(self); 
    che però non fornisce alcuna stringa in output e mi invia la notice:
    Use of undefined constant self - assumed 'self'

    Fortunatamente in php 5.3 esiste la funzione get_called_class () ed al momento ho risolto con questa, ma vorrei essere sicuro che la classe funzioni anche su versioni precedenti.

    Qualcuno può dirmi come garantire questa retrocompatibilità?

    PS spero che php6 migliori in qualche modo la questione ereditarietà perchè così non è affatto semplice... almeno per me che sono abbastanza ignorante di oop


    grazie in anticipo
    Digital Riot!
    http://fatmatt.wordpress.com
    -Chi è disposto a rinunciare alla propria libertà in cambio di sicurezza, non merita ne libertà ne sicurezza- Benjamin Franklin

  2. #2
    self si riferisce alla classe dove self viene utilizzato, ergo anche se estendi ti stai rivolgendo alla classe estesa, e non alla corrente.
    Per ovviare in PHP 5.3 hai static, e ti consiglio la lettura di questo post, l'unico modo, a mio avviso, per estendere un Singleton, qualcosa di inconcepibile per altri linguaggi di programmazione "più seri": http://webreflection.blogspot.com/20...-abstract.html
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  3. #3
    Qui è questione di late static binding, introdotto in php 5.3 (alla buon ora)

    Grazie per avermi aperto gli occhi XD
    Digital Riot!
    http://fatmatt.wordpress.com
    -Chi è disposto a rinunciare alla propria libertà in cambio di sicurezza, non merita ne libertà ne sicurezza- Benjamin Franklin

  4. #4
    Originariamente inviato da fatmatt
    Qui è questione di late static binding, introdotto in php 5.3 (alla buon ora)

    Grazie per avermi aperto gli occhi XD
    si ma occhio alla compatibilità ... ho letto poi che volevi fare qualcosa di retrocompatibile, beh allora uno degli errori che hai fatto è usre get_class(self) mentre dovevi fare get_class($this), poi c'è tutto il resto, che come hai detto non ne sai molto di OOP quindi magari leggiti qualche soluzione e cerca di capirla prima di crare singletons che singletons non sono, è solo un consiglio
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  5. #5
    beh get_class(self) lho trovato in un tutorial come soluzione per ottenere il nome della classe staticamente, come vedi il metodo è static quindi non puoi chiamare get_class($this)
    Digital Riot!
    http://fatmatt.wordpress.com
    -Chi è disposto a rinunciare alla propria libertà in cambio di sicurezza, non merita ne libertà ne sicurezza- Benjamin Franklin

  6. #6
    Originariamente inviato da fatmatt
    beh get_class(self) lho trovato in un tutorial come soluzione per ottenere il nome della classe
    cambia fonti


    Originariamente inviato da fatmatt
    staticamente, come vedi il metodo è static quindi non puoi chiamare get_class($this)
    hai ragione, su quello puoi solo fare new self;
    codice:
    public static function getInstance()
            {
                    if(self::$_instance === null)
                            self::$_instance = new self;
                    return self::$_instance;
            }
    questo ti costringe in PHP < 5.3 a ridefinire il metodo getInstance per ogni singleton ma è la soluzione migliore per performances e affidabilità, in PHP < 5.3
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    credo di aver capito grazie mille della disponibilità cercherò di approfondire e di diffidare delle fonti non verificate via internet XD
    Digital Riot!
    http://fatmatt.wordpress.com
    -Chi è disposto a rinunciare alla propria libertà in cambio di sicurezza, non merita ne libertà ne sicurezza- Benjamin Franklin

  8. #8
    noto ora un problema però....

    Provando ad instanziare due volte una classe che estende singleton, non viene lanciata alcuna eccezione.... cercherò di risolvere

    EDIT: ora ho capito.....
    Digital Riot!
    http://fatmatt.wordpress.com
    -Chi è disposto a rinunciare alla propria libertà in cambio di sicurezza, non merita ne libertà ne sicurezza- Benjamin Franklin

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    19
    Originariamente inviato da andr3a
    ti consiglio la lettura di questo post, l'unico modo, a mio avviso, per estendere un Singleton, qualcosa di inconcepibile per altri linguaggi di programmazione "più seri": http://webreflection.blogspot.com/20...-abstract.html
    Ho provato ad eseguire lo script (su PhpDesigner), e non mi dà errore alla riga if(isset(static::$INSTANCE)) riguardo al termine "static". Premetto che pur conoscendo bene la oop e altri linguaggi di programmazione, mi sto avvicinando a php solo adesso. Ho letto sui vari manuali l'utilizzo di "static", ma non ho trovato niente di diverso rispetto a C, Java, ecc. Dall'articolo sembra che in Php "static" possa essere usato in modo diverso. Come funziona "static" in questo contesto? E come faccio ad eseguire lo script?

    Ciao, grazie.

  10. #10
    Potrebbe essere dovuto al fatto che utilizzi una versione di php meno recente della 5.3 in cui è stato introdotto quell'uso di static.
    Digital Riot!
    http://fatmatt.wordpress.com
    -Chi è disposto a rinunciare alla propria libertà in cambio di sicurezza, non merita ne libertà ne sicurezza- Benjamin Franklin

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.