singleton in php4

ciao a tutti.........

mi potreste consigliare come realizzare un singleton in php4?

thanks:-)

inviato 8 anni fa
dyd666
X 0 X

ciao a tutti.........

mi potreste consigliare come realizzare un singleton in php4?

dai un occhiata qui..

http://wiki.grusp.it/tips:singleton

risposto 8 anni fa
neryo
X 0 X

thanks gentilissimo proprio quello che mi occorreva ;-)

risposto 8 anni fa
dyd666
X 0 X

Io preferisco questa versione:

<?php
class NomeClasse {
 
    function NomeClasse ($directCall=true)
    {
        if ($directCall) {
            trigger_error("NomeClasse e' un singleton!", E_USER_ERROR);
        }
    }
 
    function &getInstance() {
        static $thisInstance;
        if(!isset($thisInstance[0]))
        {
            $thisInstance = array();
            $thisInstance[0] =& new NomeClasse(false);
        }
        return $thisInstance[0];
    }
}
?>
risposto 8 anni fa
Gianni Tomasicchio
X 0 X

thanks gianni  , ottimo .... ;D

risposto 8 anni fa
dyd666
X 0 X

Attenzione a richiamare il singleton in questo modo:

$unicoOggetto =& NomeClasse::getInstance();

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

kk

;-)

risposto 8 anni fa
dyd666
X 0 X

In realtà dovrebbe funzionare anche così, solo che non l'ho provata:

<?php
class NomeClasse {
 
    function NomeClasse ($directCall=true)
    {
        if ($directCall) {
            trigger_error("NomeClasse e' un singleton!", E_USER_ERROR);
        }
    }
 
    function &getInstance() {
        static $thisInstance;
        if(!isset($thisInstance))
        {
            $thisInstance = array();
            $thisInstance = new NomeClasse(false);
        }
        return $thisInstance;
    }
}
?>
risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Mhh, come mai $thisInstance viene istanziata prima come array e poi come NomeClasse?

È un workaround?

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

No semplicemente $thisInstance contiene dentro di se se stesso, se c'è il singleton è attivo, se no no.

Ho trovata questa pagina interessantissima anche per vedere le differenze usando PHP4 o 5

http://www.patternsforphp.com/wiki/Singleton

e pure qui:

http://www.phphacks.com/index2.php?option=com_content&do_pdf=1&id=40

risposto 8 anni fa
Marco Grazia
X 0 X

Credo di non essermi spiegato nel migliore dei modi:

mi chiedevo come mai $thisInstance venga dapprima dichiarata come array, e poi instanziata nuovamente come tipo NomeClasse.

Non sarebbe stato sufficiente la seconda istruzione:

<?php $thisInstance = new NomeClasse();

???

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Non solo ma credo che si debba anche richiamare per riferimento con un & davanti.

$thisInstance deve essere un array, e con il riferimento si mette dentro all'array la chiamata alla classe, ni pratica è una chiamata ricorsiva a se stesso, ma senza l'& davanti non avrebbe senso, quindi dovrebbe essere:

<?php
class NomeClasse {
 
    function NomeClasse ($directCall=true)
    {
        if ($directCall) {
            trigger_error("NomeClasse e' un singleton!", E_USER_ERROR);
        }
    }
 
    function &getInstance() {
        static $thisInstance;
        if(!isset($thisInstance))
        {
            $thisInstance = array();
            $thisInstance =& new NomeClasse(false);
        }
        return $thisInstance;
    }
}
?>

Anche se a dirla tutta nel primo url che ti ho passato la stessa classe viene implementata in modo leggermente diverso, cioè così:

<?php
class Settings (
 
    $settings = array();
 
    function Settings() {
        // no support for "private" keyword
    }
 
    function &getInstance() {
        static $thisInstance;
        if(!isset($thisInstance[0]))
        {
            $thisInstance = array();
            $thisInstance[0] =& new Settings();
        }
        return $thisInstance[0];
    }
 
    function import() {
        // ...
    }
 
    function get() {
        // ...
    }
 
}
?>

e va richiamata così: mySettings =& Settings::getInstance();

Dove nel secondo esempio il doppio array è dovuto al fatto che esso ora può instanziare più classi.

risposto 8 anni fa
Marco Grazia
modificato 8 anni fa
X 0 X

Mhh, come mai $thisInstance viene istanziata prima come array e poi come NomeClasse?

È un workaround?

:bye:

no, è un errore  ;D quella riga va tolta

e poi non serve la & in

if(!isset($thisInstance))
{
   $thisInstance = new NomeClasse(false);
}

poiché l'assegnazione ad una variabile statica in PHP 4 avviene sempre per riferimento. Siccome questa caratteristicha di PHP 4 non è mai stata molto chiara, allora gli sviluppatori che cercavano di usare la & per evitare la copia dell'oggetto vedevano che il codice non funzionava, allora per aggirare il problema creavano un array ed assegnavano per riferimento l'istanza all' primo elemento dell'array. In questo caso quindi l'assegnazione non avveniva direttamente alla variabile statica ma ad un suo elemento interno e così la & tornava a funzionare.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
modificato 8 anni fa
X 0 X

ehmmmmmmmmmmmmmmm

ricapitolando :

  function &getInstance() {

        static $thisInstance;

        if(!isset($thisInstance))

        {

            $thisInstance = array();

            $thisInstance =& new NomeClasse(false);

        }

        return $thisInstance;

diventa

  function &getInstance() {

        static $thisInstance;

        if(!isset($thisInstance))

        {

           $thisInstance = new NomeClasse(false);

        }

        return $thisInstance;

risposto 8 anni fa
dyd666
X 0 X

si  :bye:

<?php
class NomeClasse {
 
    function NomeClasse ($directCall=true)
    {
        if ($directCall) {
            trigger_error("NomeClasse e' un singleton!", E_USER_ERROR);
        }
    }
 
    function &getInstance() {
        static $thisInstance;
        if(!isset($thisInstance))
        {
            $thisInstance = new NomeClasse(false);
        }
        return $thisInstance;
    }
}
?>
risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Chi l'ha provata? Perché l'altra forma funziona.

risposto 8 anni fa
Marco Grazia
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda