Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Usare in classe variabili incluse con require

    Ciao a tutti,
    è il mio primo messaggio, quindi chiedo scusa per eventuali comportamenti non benvoluti in questo forum. Premetto comunque che ho già cercato soluzioni, trovano threads che però non mi hanno portato alla soluzione.

    Veniamo al problema.

    Sto scrivendo un'applicazione in php che andrà integrata in un sistema esistente che gestisce utenti e permessi. Così, in ogni pagina da me scritta verrà inclusa una pagina (per semplicità: "auth.htm") che contiene i dati relativi all'utente che la sta usando.
    Per semplicità, potrei avere:
    auth.htm,
    Codice PHP:
    <?php
    $id_utente 
    "utente";
    ?>
    Ho scritto alcune pagine che si interfacciano al database, sono semplici funzioni e, mettendo in testa il
    Codice PHP:
    require_once("auth.htm"
    all'interno della mia pagina ho effettivamente che il contenuto di $id_utente vale "utente".



    Oggi stavo sviluppando una serie di classi. Una di esse ha bisogno di questa variabile, però facendo:
    mia classe php:
    Codice PHP:
    <?php
    require_once("auth.htm");

    class 
    Prova{
     public 
    Prova(){
      print 
    "sono nel costruttore e id_utente vale ".$id_utente;
     }
    }
    Quando vado ad istanziare un oggetto di tipo Prova ottengo "sono nel costruttore e id_utente vale ".

    Ci ho dovuto pensare un pò, e nonostante sia più o meno giunto al motivo per cui ottengo una variabile vuota (non esiste come attributo di Prova, quindi all'interno di un oggetto istanziato in pratica non è mai stata creata la viariabile $id_utente) faccio fatica a capire come uscire da questa situazione.

    Potete darmi un consiglio?
    Specifico che non posso mettere mani al file auth.htm.


    Intanto vi ringrazio,

    Buona giornata,
    MJ

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Perchè all'interno della classe la variabile non esiste..

    se vuoi che esista devi fare in modo che il costruttore accetti un parametro, e poi quando istanzi la classe glielo passi tra le parentesi tonde.

    ciao

  3. #3
    La cosa + pulita da fare è passare id_utente alla tua classe(magari nel costruttore) ed acquisirlo in un attributo (magari privato).
    Codice PHP:


    class Prova
    private 
    $id_utente;

    public function 
    Prova($id_utente){ 
     
    $this->id_utente=$id_utente;



    public function 
    showUtente() {
      print 
    "sono nel costruttore e id_utente vale ".$this->id_utente

    }



    oppure (più semplice ma + sporco), globalizzare id_utente nel costruttore

    Codice PHP:


    class Prova

    public function 
    Prova(){ 
      global 
    $utente;
      print 
    "sono nel costruttore e id_utente vale ".$this->id_utente

    }


    Fidatevi del dottor Auz!
    http://dottorauz.blogspot.com

  4. #4
    Grazie. Avevo pensato a questa soluzione (edit: mi riferivo alla precedente risposta ), ma preferivo non modificare i costruttori delle mie classi.

    Ma visto che anche tu mi confermi che è la soluzione migliore, percorrerò questa strada.


    Grazie a entrambi.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    698
    ora non so esattamente come funzionano gli scope all'interno di una classe php, e probabilmente hai ragione tu, non essendo membro della classe quella variabile non è allocata

    ma hai provato a dichiararla come global?

    cioe

    codice:
    global $utente
    a livello di funzione si fa cosi per importare una variabile nello scope della funzione stessa

    però comunque non capisco cosa ti impedisce di passare un argomento al tuo costruttore:

    codice:
    public prova ($u)
    {
        $this->utente = $u;
        print "sono nel costruttore e id_utente vale ".$this->utente; 
    }

    EDIT: scusate l'accavallamento..avete fatto prima voi a scrivere due messaggi che io a scriverne uno solo

  6. #6
    Originariamente inviato da Gil Mour
    però comunque non capisco cosa ti impedisce di passare un argomento al tuo costruttore:
    non me lo impedisce nessuno. In realtà cercavo di fare una cosa di questo tipo perché in altre pagine avevo adottato lo stesso metodo, e stupidamente mi impuntavo sul cercare di farlo così anche all'interno delle mie classi.


    Per fortuna non mi tocca modificare tutte e 5 le classi, ma solo la classe padre

  7. #7
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da Gil Mour
    ora non so esattamente come funzionano gli scope all'interno di una classe php, e probabilmente hai ragione tu, non essendo membro della classe quella variabile non è allocata

    ma hai provato a dichiararla come global?

    cioe

    codice:
    global $utente
    a livello di funzione si fa cosi per importare una variabile nello scope della funzione stessa

    però comunque non capisco cosa ti impedisce di passare un argomento al tuo costruttore:

    codice:
    public prova ($u)
    {
        $this->utente = $u;
        print "sono nel costruttore e id_utente vale ".$this->utente; 
    }

    EDIT: scusate l'accavallamento..avete fatto prima voi a scrivere due messaggi che io a scriverne uno solo
    Comunque ribadiamo il concetto. Anche se comodo l'array $GLOBALS (o comunque la dichiarazione di variabili globali) è il male.

    Perchè immagina in un'applicazione complessa quante variabili id_utente ci possono essere.
    O peggio ancora, domani vuoi utilizzare la tua classe in un'altra applicazione, dove non sai quali e quante sono le variabili in gioco.

    Ciao

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.