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

    Singleton autoconfigurante

    Ho un dubbio sulla classe Singleton (... e té paréva! )

    Per una singleton definisco tale constructor:
    Codice PHP:
    private function __construct() {
            if(
    is_null($istanzaClasse)) {
                
    $istanzaClasse = new Classe;
                
                
    /* Impostazione proprietà */
                
                
    $this->$HTTP_HOST $_SERVER['HTTP_HOST'];        // Nome dell'host su cui risiede il server
                
    $this->$SERVER_NAME $_SERVER['SERVER_NAME'];
                
    $this->$SERVER_OS = (strpos(strtoupper($_SERVER['SERVER_SOFTWARE']), "WIN32") === FALSE "LINUX" "WINDOWS");
                
            }
            return 
    $istanzaClasse;
                    
        } 
    la classe ha poi una miriade di proprietà statiche:
    Codice PHP:
    public static $HTTP_HOST null;

    public static 
    $SERVER_OS null;
    ...
    ... 
    Quando voglio sapere su che sistema operativo gira il webserver faccio
    Codice PHP:
    $OS Classe::$SERVER_OS
    Non creando però mai direttamente un'istanza della classe non viene mai eseguito il costruttore.

    Invece io vorrei richiamare il valore della proprietà e far sì che questo venga processato (tipo "capire che OS uso") e restituito in automatico quando richiamo la proprietà statica.

    E' possibile (sempre non creando alcuna istanza ovviamente), oppure devo farmi una funzione apposita per inizializzare tutti i valori delle proprietà statiche della classe?

    .... e aggiungo, nel secondo caso, la funzione può in qualche modo essere nella classe stessa?
    Perché se creo una funzione di inizializzazione e uso 'this' mi dà errore (che non esiste alcuna istanza a cui fare riferimento)..


    Grazie dei chiarimenti

  2. #2
    Il codice che hai postato contiene svariate sviste sia di sintassi che di logica (es. la variabile locale $istanzaClasse, $this->$HTTP_HOST, etc. ).

    Perchè prima di metterti a provare cose "esoteriche" come le classi Singleton non provi con la programmazione OO di base?

  3. #3
    Originariamente inviato da filippo.toso
    Il codice che hai postato contiene svariate sviste sia di sintassi che di logica (es. la variabile locale $istanzaClasse, $this->$HTTP_HOST, etc. ).
    Me le dici tutte fra che ci sei?

    Il $ mi è sfuggito: tanto ci pensa PHP a dirmelo. Nel vero codice non c'è quell'errore.

    La variabile locale invece mi era sfuggita proprio
    Menomale che non era un errore bloccante e che questa classe la istanzio solo una volta (nelle altre classi è fatto correttamente il riferimento alla proprietà static).

    Perchè prima di metterti a provare cose "esoteriche" come le classi Singleton non provi con la programmazione OO di base?
    Per diverse motivazioni:
    - ho poco tempo
    - seguo le mie necessià a prescindere dalle mie conoscenze. Al massimo imparo sulla mia pelle. Causa il primo punto.
    - provando cose complesse sono costretto a far funzionare le cose semplici. Due piccioni con una fava.
    - sono geneticamente portato verso l'esoterismo; in tutti gli ambiti
    - uso già abbondantemente classi singleton nel mio portale, e mi fanno risparmiare smenate cervellotiche a cercare una soluzione più 'di base' ma molto più lunga (ancora, vedi primo punto).

    Nel mio caso la singleton la uso più come classe statica per l'accesso globale alla configurazione del portale.

    Rinnovo la domanda.


    Gracias.

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    143
    Il problema grande é che il codice che hai postato non é una singleton, é una cosa strana che sembra non aver alcun senso.
    E anche le tue richieste sono confuse.
    Dici che la singleton la usi 'come classe statica per l'accesso globale alla configurazione del portale'.
    Ma che significa? La sinlgeton si utlizza come ... singleton. Le classi statiche come ... classi statiche.
    Lapalissiano
    Spiega meglio quello che vorresti fare, magari.

  5. #5
    Originariamente inviato da kiboo
    Il problema grande é che il codice che hai postato non é una singleton, é una cosa strana che sembra non aver alcun senso.
    L'ho scritto molti mesi fa, non ricordo la logica.
    Ma sicuramente mi son basato su qualche articolo che parlava di Singleton, o di qualche pattern simile.

    Per una singleton devo dichiarare il costruttore privato e gestire un metodo di ottenimento dell'istanza, in modo che sia sempre la stessa, se già presente, no?


    Effettivamente, essendo private, la construct non viene mai eseguita. Me ne rendo conto adesso

    Apparte il fatto di aver scritto nel construct operazioni che non potrò mai eseguire (ininfluente), in che cos'altro ho sbagliato la realizzazione del singleton? (escluso ovviamente il fatto che non ho riportato il metodo di ricavo dell'istanza)

    E anche le tue richieste sono confuse.
    Dici che la singleton la usi 'come classe statica per l'accesso globale alla configurazione del portale'.
    Ma che significa? La sinlgeton si utlizza come ... singleton. Le classi statiche come ... classi statiche.
    A me pareva avesse un senso.
    Almeno leggendo il confronto tra i due.
    http://my.opera.com/zomg/blog/2007/0...static-classes

    A me è utile una classe con proprietà e metodi statici al fine di potervi fare riferimento da qualunque scope dell'applicazione.

    Per quanto riguarda la classe di configurazione poi vorrei che si mantenesse una sola istanza, quindi singleton.

    Forse sono bollito io (è facile) ma il pattern Singleton non è un modo particolare di implementare una classe statica?
    Lapalissiano
    Lillipuziano!

    Apparte gli scherzi; non sono un mago della OOP ma citando HTML.it ho trovato questo:

    http://php.html.it/articoli/leggi/20...php-singleton/
    "...dal punto di vista pratico non vi è alcuna differenza tra un'istanza statica di una classe ed un singleton, anche se l'utilizzo del pattern permette una stesura di codice più elegante e soprattutto ritarda la creazione dell'istanza al momento in cui verrà richiesta per la prima volta, diminuendo i consumi inutili di memoria."
    Non capisco dove sia il grosso errore.

    Spiega meglio quello che vorresti fare, magari.
    Come dicevo sopra:
    - avere proprietà 'globali', per snellire il codice e non dover stare a passare sempre istanze o altro (per la classe Configurazione o quella MySQL)
    - avere metodi 'globali', raggiungibili da dovunque.
    - mantenere una sola istanza delle classi, in modo da fare riferimento (x es.) sempre alla stessa Configurazione

    In pratica il fine è l'ottenimento di 'librerie' piuttosto che 'oggetti'.

  6. #6
    Ma perchè tutti i niubbi vogliono sempre fare gli spacconi..

  7. #7
    Originariamente inviato da n0t
    Ma perchè tutti i niubbi vogliono sempre fare gli spacconi..
    Senti, o rispondi in modo costruttivo o ti segnalo.

    Sono agli inizi con la OOP, va bene. Vengo qua per imparare (anche a capire dove sbaglio se possibile). Ma posso avere delle curiosità?
    Oppure solo all'elitaria congrega degli 'esperti' programmatori presuntuosi dei mei zibidei è concesso il sacro diritto di fare domande idiote?

    Se mi vuoi insegnare qualcosa mi trovi ben disposto.
    Altrimenti defilati un pò dal mio thread perfavore.

    Grazie

  8. #8
    Originariamente inviato da pictor
    Senti, o rispondi in modo costruttivo o ti segnalo.

    Sono agli inizi con la OOP, va bene. Vengo qua per imparare (anche a capire dove sbaglio se possibile). Ma posso avere delle curiosità?
    Oppure solo all'elitaria congrega degli 'esperti' programmatori presuntuosi dei mei zibidei è concesso il sacro diritto di fare domande idiote?

    Se mi vuoi insegnare qualcosa mi trovi ben disposto.
    Altrimenti defilati un pò dal mio thread perfavore.

    Grazie
    E tu sei vuoi imparare qualcosa hai ben disposto il manuale ufficiale.. :tsè:

    Il forum è un posto dove posti piccole lacune, concetti non compresi a fondo, non un posto dove trovare il tutor del CEPU a tua disposizione.

    Tra l'altro ci sono persone che hanno rubato del tempo prezioso da quello che hanno a disposizione e ti hanno proposto delle dritte, ma tu continui a fregartene e continuare con il tuo "Ho poco tempo".

    Bene, o studi o assoldi chi lo faccia per te in poco tempo.

    Vedi, ti è stata proposta anche una nuova soluzione.

  9. #9
    Originariamente inviato da n0t
    E tu sei vuoi imparare qualcosa hai ben disposto il manuale ufficiale.. :tsè:
    Senti, è inutile che fai il sostenuto. Sei irrotto in questo thread con un atteggiamento da sapientino scassapalle, in modo totalmente invadente senza aggiungere altro.
    Dovresti chiedere intanto scusa per quello prima di potermi insegnare qualunque altra cosa (che potrei pure anche accettare ovviamente).

    Non fare quello "spaccone" che stai cercando di affibbiarmi.
    Il forum è un posto dove posti piccole lacune, concetti non compresi a fondo, non un posto dove trovare il tutor del CEPU a tua disposizione.
    Ma che diavolo c'entra?
    Mi vuoi insegnare ad usare un forum?

    Questo è come TU usi il forum. Libero di farlo.
    Io, tra le altre cose, lo trovo un posto dove imparare (e insegnare) interi argomenti. Perchè no?
    Chi ha detto che non è possibile? Chi ha detto che è sbagliato?

    E ad ogni modo, a prescindere da questo, non l'ho neanche chiesto.
    Quel che ho chiesto testualmente era un chiarimento su un concetto non compreso a fondo (contento? ) riguardo all'argomento singleton, di cui ho già letto un monte di articoli ma che faccio fatica ad assimilare; causa la saltuarietà del tempo che riesco a dedicare al PHP.

    Se dico che "non ho il tempo" di stare solo a studiarmi programmazione è perché è la verità e ho altre tremila mansioni da seguire. Non perché voglio la pappa scodellata.

    Se permetti gli errori di comprensione penso di poterli fare.
    O bisogna comportarsi da intransigenti compilatori anche con le persone?

    Tra l'altro ci sono persone che hanno rubato del tempo prezioso da quello che hanno a disposizione ...
    Ed è implicito (nonché testualmente esplicitato) che le ringrazio...

    Senti, io sono tra quelle stesse persone che toglie il proprio tempo per questo forum. L'ho sempre fatto. Da anni oramai, quando posso.
    E spesso e volentieri sono stato tra quei (come li chiami tu) "tutor CEPU", dedicando ore intere al problema dello sconosciuto di turno.
    Io lo faccio e mi farebbe piacere che (per chissà quale ingenua e altruistica legge karmica) gli altri mi aiutassero allo stesso modo quando ho dei problemi o dei dubbi.
    Ovviamente senza che un signor nessuno mi venga a crititcare sul fatto che sono un dilettante e che voglio fare lo spaccone (sulla base di che, poi?).
    Le tue competenze in PHP non ti danno il diritto di giudicarmi. Al massimo ti danno quello di rispondermi.

    e ti hanno proposto delle dritte, ma tu continui a fregartene e continuare con il tuo "Ho poco tempo".
    Forse tu hai tutto il tempo di nerdizzarti su tutto quello che ti interessa, senza fretta, spulciandoti anche il più inutile dei dettagli.
    Io sono a lavoro e, per quanto lo possa desiderare, non ho il tempo di dedicarmi totalmente allo studio. E, per quanto sia combattuto sulla scelta (se proprio vuoi che entri nel merito), la mia priorità è continuare il lavoro piuttosto che passare giornate intere a studiare.
    So cosa dovrei fare per imparare la OOP a regola d'arte, mi piacerebbe anche poterlo fare, ma non venire a farmi i conti in tasca, perché se non mi son messo a studiarla totalmente probabilmente c'è un motivo.
    Cerco il miglior compromesso, nel rispetto altrui, mi pare.

    Oltretutto mi dici quali dritte rivelatrici o risolutorie mi sono state proposte, visto che hai tutta questa grand'intelligenza più di me?

    Mi è stato detto di tornare indietro o di spiegarmi meglio. Ho fatto entrambi: rileggendomi meglio della documentazione e precisando cosa sto chiedendo.

    Mi dici che michia vuoi?
    .... Hai caàto fuori dal vaso.
    .... e mi stai sm*rdando il thread.

    Bene, o studi o assoldi chi lo faccia per te in poco tempo.

    Vedi, ti è stata proposta anche una nuova soluzione.
    Soluzione del menga se permetti: e lo sai.

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2007
    Messaggi
    143
    Effettivamente, essendo private, la construct non viene mai eseguita. Me ne rendo conto adesso
    Certo che viene 'eseguita', una sola volta. Ma nel tuo codice mancava il metodo statico per 'eseguire' il codice del __construct. Confronta il tuo codice con quello dell'articolo che citi di html.it e vedrai.


    Come dicevo sopra:
    - avere proprietà 'globali', per snellire il codice e non dover stare a passare sempre istanze o altro (per la classe Configurazione o quella MySQL)
    - avere metodi 'globali', raggiungibili da dovunque.
    - mantenere una sola istanza delle classi, in modo da fare riferimento (x es.) sempre alla stessa Configurazione

    In pratica il fine è l'ottenimento di 'librerie' piuttosto che 'oggetti'.
    L'utilizzo che vorresti é perfetto.
    Ad esempio potresti salvare tutta la configurazione del tuo sito in un file .ini o xml o quello che vuoi e accedervi in questo modo

    Codice PHP:
    class Settings {
        
        private static 
    $instance;
        private 
    $settings;
       
        private function 
    __construct() {

            
    $ini_file "settings.ini";
            
    $this->settings parse_ini_file($ini_filetrue);

        }
       
        public static function 
    getInstance() {
            if(! isset(
    self::$instance)) {
                
    self::$instance = new Settings();           
            }

            return 
    self::$instance;
        }
       
        public function 
    __get($setting) {
            if(
    array_key_exists($setting$this->settings)) {
                return 
    $this->settings[$setting];
            } else {
                foreach(
    $this->settings as $section) {
                    if(
    array_key_exists($setting$section)) {
                        return 
    $section[$setting];
                    }
                }
            }
        }
        

    E richiamare ogni variabile di configurazione in questo modo:

    Codice PHP:
    $config Settings::getInstance();

    var_dump($config); //ecco il risultato 
    Il file settings.ini sará qualcosa tipo

    [environment]
    root = /var/path/to/

    [mysql]
    host = localhost
    user = user

    etc.

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.