Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306

    funzione di classe non visualizzata completamente

    Ciao a tutti ragazzi
    sto incominciando lo studio della programmazione ad oggetti PHP


    ho creato nella cartella principale un file "index.php" ed una cartella "classi" che conterrà le varie classi che andrò a sviluppare .


    La classe Libro1.php
    Codice PHP:
    <?php
    class Libro {     
    public 
    $titolo;     
    public 
    $autore;  
    public 
    $codiceisbn
    public 
    $prezzo;  
    private 
    $quantita;   
          
     public function 
    leggoTitolo(){       

      echo 
    $this->titolo '-' $this->autore;     }    

    public function 
    salvoLibro(){         
        return 
    "Libro salvato" .$this->leggoTitolo();  }   


      }
    il file index.php
    Codice PHP:
    <?php
        
    require_once "classi/Libro1.php"
       
    $nlibro= new Libro();       
    $nlibro->titolo='Eneide';
    $nlibro->autore='Virgilio';

    var_dump($nlibro);  //stampo l'oggetto $nlibro


    $nlibro1= new Libro();      
    $nlibro1->titolo='I promessi sposi'
    $nlibro1->autore='Manzoni';


    echo 
    "<br>";      
      
    $nlibro -> leggoTitolo();    
    echo 
    "<br>";   
     
    $nlibro1 -> leggoTitolo();

        echo 
    "<br>";    
    $nlibro -> salvoLibro();   
     echo 
    "<br>";  
      
    $nlibro1 -> salvoLibro();

    1)

    Vi chiedo perchè andando ad eseguire il file index.php non mi esce "Libro salvato" ?

    poi se vado a modificare l'ultima parte del file index.php con

    Codice PHP:
    echo "<br>";&#8203;
    echo $nlibro -> salvoLibro();

    echo 
    "<br>";&#8203;
    echo $nlibro1 -> salvoLibro(); 
    allora vedo prima il titolo-autore e poi "libro salvato" ?

    Non dovrei vedere prima " libro salvato " e poi la coppia titolo-autore ?

    2)
    se con
    Codice PHP:
    $nlibro -> salvoLibro(); 
    faccio riferimento alla funzione salvoLibro() perchè c'è bisogno di echo?
    Ultima modifica di Alfoxx; 03-10-2016 a 12:16

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509
    Nella funzione salvoLibro() tu fai un

    return "Libro salvato" .$this->leggoTitolo();

    return non stampa niente, restituisce solo un valore, per stamparlo a video devi farne l'echo, per questo se usi echo funziona.

    E' giusto che per come hai scritto il codice venga prima stampato il titolo e l'autore del libro e poi il messaggio del salvataggio avvenuto, funziona così:

    echo $nlibro -> salvoLibro();

    viene eseguita la funzione salvoLibro(), la quale chiama leggoTitolo()
    leggoTitolo() stampa il titolo e l'autore del libro perché c'è l'echo, poi termina la sua esecuzione e si torna a salvoLibro()
    ora salvoLibro() ritorna la stringa "Libro salvato" .$this->leggoTitolo() che viene stampata dall'echo messo nella chiamata
    echo $nlibro -> salvoLibro();

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Grazie mille per avermi risposto

    ma allora nella funzione
    Codice PHP:
    public function salvoLibro(){         
        return 
    "Libro salvato" .$this->leggoTitolo();  }   


      } 
    viene data la precedenza alla funzione leggoTitolo()

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509
    Non è questione di precedenza, ma di ordine in cui vengono chiamate le funzioni.

    Codice PHP:
    function A() {
        
    B();
        echo 
    'Funzione A';
    }

    function 
    B() {
        echo 
    'Funzione B';
    }

    A(); 
    In questo codice viene chiamata la funzione A()
    la funzione A() per prima cosa chiama la funcione B() e si ferma in attesa che la funzione B() venga eseguita e termini
    B() stampa "Funzione B", termina e si torna alla funzione A() che adesso passerà all'istruzione seguente alla chiamata di B(), quindi stamperà "Funzione A".

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Nella funzione salvoLibro() tu fai un

    return "Libro salvato" .$this->leggoTitolo();

    return non stampa niente, restituisce solo un valore, per stamparlo a video devi farne l'echo, per questo se usi echo funziona.

    E' giusto che per come hai scritto il codice venga prima stampato il titolo e l'autore del libro e poi il messaggio del salvataggio avvenuto, funziona così:

    echo $nlibro -> salvoLibro();

    viene eseguita la funzione salvoLibro(), la quale chiama leggoTitolo()
    leggoTitolo() stampa il titolo e l'autore del libro perché c'è l'echo, poi termina la sua esecuzione e si torna a salvoLibro()
    ora salvoLibro() ritorna la stringa "Libro salvato" .$this->leggoTitolo() che viene stampata dall'echo messo nella chiamata
    echo $nlibro -> salvoLibro();
    quindi viene chiamata leggoTitolo(), al termine di questa funzione non c'è nessun altra operazione se non il return "libro salvato".
    quindi non si tratta di precedenza, proprio perchè il return è l'operazione finale di una funzione. Se c'è la funzione ritorna qualcosa.



    Se avessi voluto usare il comando
    Codice PHP:
     $nlibro -> salvoLibro(); 
    senza echo, e vedere prima "Libro salvato " e poi il titolo e l'autore
    dovevo impostare la funzione salvoLibro() così:

    Codice PHP:

    <?php
    class Libro {     
    public 
    $titolo;     
    public 
    $autore;  
    public 
    $codiceisbn
    public 
    $prezzo;  
    private 
    $quantita;   
          
     public function 
    leggoTitolo(){       

      echo 
    $this->titolo '-' $this->autore;     }    

    public function 
    salvoLibro(){         
        echo 
    "Libro salvato" .$this->leggoTitolo();  }   


      }

  6. #6
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509
    No, anche in questo caso avresti avuto prima titolo e autore, poi la stampa del libro salvato.

    echo "Libro salvato" .$this->leggoTitolo();

    prima si interpreta la stringa da stampare, poi la si stampa, quindi prima viene eseguito $this->leggoTitolo() e poi l'echo di "Libro salvato".

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    No, anche in questo caso avresti avuto prima titolo e autore, poi la stampa del libro salvato.

    echo "Libro salvato" .$this->leggoTitolo();

    prima si interpreta la stringa da stampare, poi la si stampa, quindi prima viene eseguito $this->leggoTitolo() e poi l'echo di "Libro salvato".

    ok grazie per le precisazioni

  8. #8
    Grazie! Molto utile!

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Ho un'altra domanda molto simile al tema che è stato affrontato....


    ho una classe hits che non ha un costruttore , ma ha una funzione increment che dovrebbe incrementare di 1 la proprietà statica $numvolte appena si istanzia l'oggetto volte.

    Codice PHP:
    class Volte {   
    protected 
    $ip;   
    protected static 
    $numvolte 0//proprietà non dell'oggetto Volte specifico, ma della classe   

    public static function increment() {  //metodo statico che accede alla prorpietà statica         
     
    return self::$numvolte++;     
     }   

       public function 
    totalVolte() {    
         return 
    self::$numvolte;  
     }   

      } 


    Con questo codice (in basso )prima creo l'oggetto $volta e incremento $numvolte tramite il richiamo della funzione increment
    e poi poichè stiamo sempre parlando di un metodo static, vado di nuovo ad incrementare la proprietà $numvolte non tramite l'oggetto ,ma con il nome della classe che richiama il metodo static increment.

    Codice PHP:

    <?php 
     
    require_once "Classi/Volte1_membri_statici1.php";

      
    $volta = new Volte();    //creo oggetto $volta  
    echo $volta::increment();    
    echo 
    "<br>"
     
    Volte::increment();      //vado di nuovo ad incrementare la proprietà $numvolte.
    echo $volta->totalVolte();

    il problema è che così messo in uscita vedo 0 e poi 2, invece di 1 e 2. Perchè?

    Mi sono dato questa spiegazione: con questa funzione increment

    Codice PHP:
    return self::$numvolte++; 
    si ritorna prima il valore di $numvolte e poi si incrementa? perciò io poi vedo prima 0 e poi 2.


    Ora però se vado a modificare la funzione increment così

    Codice PHP:

    public static function increment() {  //metodo statico che accede alla prorpietà statica 

         
    return self::$numvolte;     
      
    self::$numvolte++;      
     echo 
    "self::$numvolte";    
      } 
    perchè voglio vedere 1 e poi 1

    vedo 0 e poi 0, perchè???
    Ultima modifica di Alfoxx; 11-10-2016 a 12:00

  10. #10
    Codice PHP:
    return self::$numvolte++; 
    prima ti torna il valore e dopo lo incrementa di 1. Posizionare ++ o -- prima o dopo il numero di interesse, cambia sensibilmente l'ordine in cui viene eseguita l'operazione. nel tuo caso quindi devi mettere:

    Codice PHP:
    return ++self::$numvolte
    così prima aggiunge 1 a $numvolte e poi ritorna il numero maggiorato.

    e cmq io cambierei la classe così:

    Codice PHP:

    class Volte {   
     
        private static 
    $numvolte 0

        private function 
    __construct(){ } //rendo inaccessibile il costruttore in maniera che $volta = new Volte(); non funzioni più
                                          //fuori dalla visibilità della classe
        
        
    public static function newInstance()
        {
            
    self::$numvolte++;
            return new 
    Volte();
        }
        
        public static function 
    totVolte()
        {
            return 
    self::$numvolte;
        }

     } 
     
     
     
    //$volta = new Volte(); //se fai una prova, ti dà errore php perchè il costruttore è privato
     
     
    $volta1 Volte::newInstance();
     echo 
    Volte::totVolte();
     
    $volta2 Volte::newInstance();
     echo 
    Volte::totVolte(); 
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Tag per questa discussione

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 © 2026 vBulletin Solutions, Inc. All rights reserved.