Visualizzazione dei risultati da 1 a 7 su 7

Discussione: spiegazione funzione

  1. #1

    spiegazione funzione

    ho la seguente funzione pero non riesco a capire come funziona da $counter-- in poi grazie Giuliano
    <?php
    function conta_10(){
    static $counter=0;
    var_dump($counter);
    $counter++;
    if($counter<=10){
    conta_10();
    }
    $counter--;
    var_dump($counter);
    }
    function conta_11(){
    conta_10();
    var_dump(11);
    }
    conta_11();
    ?>


  2. #2
    avevo scritto una lunga risposta ma il forum non funziona e ha cancellato tutto il messaggio

    function conta_10(){
    $nomeCiclo = uniqid();

    static $counter=0;
    echo "entro nel ciclo $nomeCiclo, counter vale $counter<br>";
    $counter++;
    echo "nel ciclo $nomeCiclo, counter vale $counter<br>";
    if($counter<=10){
    conta_10();
    }
    $counter--;
    echo "esco dal ciclo $nomeCiclo e counter vale $counter<br>";
    }

    function conta_11(){
    conta_10();
    var_dump(11);
    }
    conta_11();
    Pensate i programmi a librerie, e innalzate il livello d'astrazione

  3. #3
    conta_10 conta, come avrai visto, da 0 a 10 e poi scala fino a 0. Di seguito è quello che succede (spero che mantenga l'indentazione, altrimenti ad ogni riga aggiungi un tab fino a "counter = 11 <= 10 ? no => counter-- => 10" e poi a scalare indietro)

    codice:
    call conta_11
    	call conta_10
    		counter = 0 //init
    		counter = 1  <= 10 ? si => conta_10
    			counter = 2  <= 10 ? si => conta_10
    				counter = 3  <= 10 ? si => conta_10
    					counter = 4 <= 10 ? si => conta_10
    						counter = 5 <= 10 ? si => conta_10
    							counter = 6 <= 10 ? si => conta_10
    								counter = 7 <= 10 ? si => conta_10
    									counter = 8 <= 10 ? si => conta_10
    										counter = 9 <= 10 ? si => conta_10
    											counter = 10 <= 10 ? si => conta_10
    												counter = 11 <= 10 ? no => counter-- => 10
    											counter-- => 9
    										counter-- => 8
    									counter-- => 7
    								counter-- => 6
    							counter-- => 5
    						counter-- => 4
    					counter-- => 3
    				counter-- => 2
    			counter-- => 1
    		counter-- => 0
    	end call conta_10
    	var_dump(11) //ma non ho capito perchè sinceramente
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    togliendo i tag PHP son riuscito a postare lo stesso il codice.
    Allora: ho sostituito i var_dump (troppo generica per un debug) con degli echo piu descrittivi, che assieme ad un uniqid ti danno meglio l'idea di quello che succede al tuo codice.

    Come vedi, grazie al fatto che si tratti di una variabile statica, il valore di counter viene passato di funzione in funzione, come se fosse una variabile globale.
    E, guardando ai codici univoci che ho creato con uniqid, puoi vedere bene cosa accade: dalle funzioni ricorsive si esce in ordine inverso (l'ultima che entra è la prima a terminare).

    diciamo che con un debug con stringhe piu descrittive puoi capire meglio quello che accade.
    Pensate i programmi a librerie, e innalzate il livello d'astrazione

  5. #5
    quello che non capisco e quando decrementa sono :
    counter = 11 <= 10 ? no => counter-- => 10
    é da qui in poi che non capisco cosa lo fa diventare 9

  6. #6
    Quote Originariamente inviata da giulianoc Visualizza il messaggio
    quello che non capisco e quando decrementa sono :
    counter = 11 <= 10 ? no => counter-- => 10
    é da qui in poi che non capisco cosa lo fa diventare 9
    Devi considerare che hai effettuato delle chiamate ricorsive per cui, dal momento in cui la condizione $counter<=10 risulta falsa, vengono eseguiti tutti i $counter-- rimasti in sospeso.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  7. #7
    allora, se $counter++ incrementa di 1 il valore di $counter, $counter-- decrementa di 1 il valore di $counter. Assodato questo, quando richiami per la prima volta conta_10, inizialliza $counter = 0, lo incrementa di 1 e arriva all'if. Se la condizione è vera, fà una chiamata ricorsiva a conta_10: "static $counter = 0;" non viene più eseguita perchè "static $counter" è già stato inizializzato alla prima chiamata, quindi incrementa $counter di 1 e arriva all'if, se if è vero nuova chiamata ricorsiva. Così dicendo finchè $counter = 10, allora $counter++ te lo setta ad 11 e l'if non è più vero e allora esegue $counter-- riportando il valore a 10. Quindi, tornando indietro nello stack delle chiamate (vedi lo schema che ti ho fatto io) l'esecuzione della chiamata riparte da dopo l'if, quindi da $counter--, quindi alla fine vedrai che il sistema conta da 0 a 10 e torna indietro a 0. Insomma, l'esecuzione della chiamata a call_10 si blocca finchè la chiamata dentro l'if non termina, quindi viene fuori lo schema che ti ho detto io prima.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

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.