Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125

    php 4 problemi con array di oggetti

    ciao.
    Ho una classe GestoreNegozio che come attributo ha un array.

    Questo array contiene oggetti di tipo Negozio

    Ogni oggetto Negozio ha come attributo un array di oggetti Dvd

    a questo punto....quando aggiungo oggetti Dvd all'oggetto Negozio , se guardo la lunghezza dell'attributo della Negozio vedo che e' stato aggiunto....ma se parto da GestoreNegozio , estraggo l'elemento n corrispondente all'oggetto Negozio (quello sul quale avevo aggiunto un elemento), e controllo quanto e' lungo.....rimane invariato.

    Faccio notare che la cosa in php5 funziona benissimo.
    Dopo continue provo sono arrivato alla conclusione che l'oggetto Negozio che estraggo dall'attributo della GestoreNegozio è una copia....non e' propriamente quell'oggetto...
    Non so e non ho capito bene quando devo anteporre il carattere & davanti agli oggetti.


    Spero di essere stato chiaro anche senza codice...
    Ma ecco il codice che invito a farvi testare su php4 e su php5 ....noterete i risultati diversi

    Codice PHP:

    class GestoreNegozio{
         
         var 
    $elencoNegozi;

         function 
    GestoreNegozio(){
            
    $this->elencoNegozi = array();
         }

         function 
    getNegozio($i){
            
    $allNeg = &$this->elencoNegozi;
            return 
    $allNeg[$i];
        }

        function 
    addNegozio($negozio){
            
    $allNeg = &$this->elencoNegozi;
            
    $allNeg[]=$negozio;
        }
        
        
        function 
    countDvd(){
         
    $allNeg = &$this->elencoNegozi;
          
    $cont=0
           for(
    $i=0;$i<count($allNeg);$i++){
                 
    $neg=$this->getNegozio($i);
                 
    $tot_neg $neg->countDvd();
                 
    $cont$cont+$tot_neg;
           }
           return 
    $cont;
        }
        
    }



    class 
    Negozio{
         
         var 
    $elencoDvd;

         function 
    Negozio(){
            
    $this->elencoDvd = array();
         }

         function 
    getDvd($i){
            
    $allDvd = &$this->elencoDvd ;
             return 
    $allDvd[$i]; 
        }

       function 
    addDvd($dvd){
            
    $alldvd = &$this->elencoDvd;
            
    $alldvd[]=$dvd;
        }
        
        function 
    countDvd(){
           
    $allDvd = &$this->elencoDvd ;
          return 
    count($allDvd);
        }
        
        
        
    }



    class 
    Dvd{
       function 
    Dvd(){
       }

    }


    $gest = new GestoreNegozio();
    $negozio = new Negozio();
    $dvd1 = new Dvd();


    //aggiungo il negozio al gestore
    $gest->addNegozio($negozio);

    //estraggo il primo negozio
    $neg $gest->getNegozio(0);
    $neg->addDvd($dvd1);



    echo 
    "il negozio ha" $neg->countDvd() . "dvd";
    echo 
    "
    "
    ;


    echo 
    "il gestore ha "$gest->countDvd() . "dvd"


    aiuto sono disperato...

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    595
    Quando vuoi che da una assegnazione non venga fatta una copia ma venga passato il riferimento all'oggetto devi fare usare "=&"
    Ti faccio un breve esempio
    Codice PHP:
    <?php
    class prova
    {
        var 
    $variabile;
        function 
    prova($valore)
        {
            
    $this->variabile $valore;
        }
    }
    $array = array();
    $array["primo"] = new prova("primo");
    $array["secondo"] = new prova("secondo");
    $estratto =& $array["primo"];
    echo 
    $estratto->variabile."
    "
    ;
    $estratto->variabile "primo modificato";
    $estratto2 =& $array["primo"];
    echo 
    $estratto2->variabile."
    "
    ;
    $estratto2->variabile "primo modificato ancora";
    echo 
    $estratto->variabile;
    ?>
    Il risultato di questa pagina è

    primo
    primo modificato
    primo modificato ancora

    Quindi, come puoi vedere, quando ho fatto
    $estratto =& $array["primo"]
    Non ho copiato $array["primo"] ma ne ho creato un "riferimento", ovvero ogni modifica a $estratto è come se avvenisse su $array["primo"], infatti estraendo di nuovo il dato con
    $estratto2 =& $array["primo"]
    La modifica fatta su $estratto infatti si ripercuote su $estratto2 e quella su $estratto2 si ripercuote ancora su $estratto (e quindi su $array["primo"])
    In pratica $estratto, $estratto2 e $array["primo"] sono tre riferimenti allo stesso oggetto.

    Spero di essere stato chiaro

    P.S.
    In php5 questa cosa viene fatta in automatico (come è giusto che sia) e per creare una copia di un oggetto si fa
    Codice PHP:
    $oggettocopiato = clone $oggetto

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    piu o meno.....
    potresti pero' porre come esempio il codice da me postato? dove sbaglio ?

    anche io uso & ...e quindi non dovrei avere in mano la copia....ma invece la ho

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    up

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    595
    Questo è il tuo sorgente modificato
    Codice PHP:
    <?php
    class GestoreNegozio{
         
         var 
    $elencoNegozi;

         function 
    GestoreNegozio(){
            
    $this->elencoNegozi = array();
         }

         function &
    getNegozio($i){ //!!! Riga da modificare aggiungendo "&" prima del nome funzione
    // questo dice alla funzione che deve restituire il riferimento e non la copia
            
    $allNeg =& $this->elencoNegozi;
            return 
    $allNeg[$i];
        }

        function 
    addNegozio($negozio){
            
    $allNeg = &$this->elencoNegozi;
            
    $allNeg[]=$negozio;
        }
        
        
        function 
    countDvd(){
         
    $allNeg = &$this->elencoNegozi;
          
    $cont=0;
           for(
    $i=0;$i<count($allNeg);$i++){
                 
    $neg=$this->getNegozio($i);
                 
    $tot_neg $neg->countDvd();
                 
    $cont$cont+$tot_neg;
           }
           return 
    $cont;
        }
        
    }



    class 
    Negozio{
         
         var 
    $elencoDvd;

         function 
    Negozio(){
            
    $this->elencoDvd = array();
         }

         function &
    getDvd($i){ //!!! Riga da modificare. Come la precedente
            
    $allDvd = &$this->elencoDvd ;
             return 
    $allDvd[$i];
        }

       function 
    addDvd($dvd){
            
    $alldvd =& $this->elencoDvd;
            
    $alldvd[]=$dvd;
        }
        
        function 
    countDvd(){
           
    $allDvd = &$this->elencoDvd ;
          return 
    count($allDvd);
        }
        
        
        
    }



    class 
    Dvd{
       function 
    Dvd(){
       }

    }


    $gest = new GestoreNegozio();
    $negozio = new Negozio();
    $dvd1 = new Dvd();


    //aggiungo il negozio al gestore
    $gest->addNegozio($negozio);

    //estraggo il primo negozio
    $neg =& $gest->getNegozio(0); //!!! Riga da modificare
    // dice all'operatore "=" di mantenere il riferimento e di non fare copia
    $neg->addDvd($dvd1);



    echo 
    "il negozio ha" $neg->countDvd() . "dvd";
    echo 
    "
    "
    ;


    echo 
    "il gestore ha "$gest->countDvd() . "dvd";
    ?>
    Ho evidenziato le righe da modificare con un commento

    La prima è in alto, funzione getNegozio

    La seconda è nella funzione getDvd

    La terza è alla fine quando la funzione getNegozio viene usata

    Ricordati quindi che ogni volta che usi getNegozio o getDvd devi scrivere

    $x =& $gestore->getNegozio($n);
    $y =& $negozio->getDvd($m);

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2005
    Messaggi
    2,125
    grazie mille....domani mattina provo.
    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.