singleton in php4

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

mi potreste consigliare come realizzare un singleton in php4?

thanks:-)

inviato 10 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 10 anni fa
neryo
X 0 X

thanks gentilissimo proprio quello che mi occorreva ;-)

risposto 10 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 10 anni fa
Gianni Tomasicchio
X 0 X

thanks gianni  , ottimo .... ;D

risposto 10 anni fa
dyd666
X 0 X

Attenzione a richiamare il singleton in questo modo:

$unicoOggetto =& NomeClasse::getInstance();

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

kk

;-)

risposto 10 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 10 anni fa
Gianni Tomasicchio
X 0 X

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

È un workaround?

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
96
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 10 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 10 anni fa
Andrea Turso
Andrea Turso
96
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 10 anni fa
Marco Grazia
modificato 10 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 10 anni fa
Gianni Tomasicchio
modificato 10 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 10 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 10 anni fa
Gianni Tomasicchio
X 0 X

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

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