Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Hybrid View

  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
    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();  }   


      }

  4. #4
    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()

  5. #5
    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".

  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
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    306
    Quote Originariamente inviata da Vam Visualizza il messaggio
    Risposta esatta.
    Prova
    Codice PHP:
    return self::++$numvolte

    Perché a parte l'indentazione terribile, stai facendo questo:
    Codice PHP:
    public static function increment()
    {
    return 
    self::$numvolte;
    self::$numvolte++;
    echo 
    "self::$numvolte";

    Quindi appena chiami la funzione "increment" (molto tra virgolette visto che non è quello che fa) ritorni $numvolte che è stato inizializzato a zero:
    Codice PHP:
    protected static $numvolte 0
    Bada bene: RITORNI. Non STAMPI.
    Ho capito quello che vuoi dirmi, però forse mi ritorna una domanda che ho fatto qualche gg fa e che forse non ho ancora ben capito, applicato a questo codice

    con questo
    Codice PHP:
    public static function increment()
    {
    return 
    self::$numvolte;
    self::$numvolte++;
    echo 
    "self::$numvolte";

    è vero che ritorni 0, perchè l'ho impostato io inizialmente a 0,
    ma poi faccio anche l'incremento e lo visualizzo con echo, non dovrebbe farmi vedere cmq 1 con echo?

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.