Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di LuckySevenRoX
    Registrato dal
    Sep 2011
    residenza
    Foligno
    Messaggi
    361

    Passaggio per riferimento

    'giorno!
    Leggendo un articolo che ricapitolava le differenze tra PHP4 e PHP5 per quanto riguarda i passaggi per valore/riferimento, ho notato un frammento di codice che utilizza un "&" subito prima del nome della funzione. Sinceramente non mi è mai capitato di usarlo, e nell'articolo non spiega bene nemmeno a cosa serve (o almeno non l'ho capito io).

    Codice PHP:
    <?php

    // Passaggio per riferimento
    function &incrementaNum(&$num){
      
    $num += 10;
      return 
    $num;
    }

    ?>
    il passaggio per riferimento l'ho sempre usato solo e soltanto sui parametri di una funzione, a cosa serve la "&" prima della funzione?

    grazie
    Ti rivedrò in un'altra vita…quando saremo tutti e due gatti...

  2. #2
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Allora di base php quando passa i dati come parametri di una funzione passa per copia di valore.


    esempio

    Codice PHP:
    function faicose($valore)
    { echo ++
    $valore ; }

    nel codice poi 

    $valore 
    23 ;

    faicose($valore) ;

    echo 
    $valore 
    Prova e vedi, poi prova questo :


    Codice PHP:
    function faicose(&$valore)
    { echo ++
    $valore ; }

    nel codice poi 

    $valore 
    23 ;

    faicose($valore) ;

    echo 
    $valore 

    Nel secondo caso non esegui una copia del dato contenuto nella variabile $valore e lo passi alla funzione, ma passi il suo "riferimento". Il riferimento non e' altro che il puntatore in memoria della variabile e quindi per "riferimento" tu stai passando l'indirizzo di memoria e non il valore della variabile.

    Prova gli esempi e ragionaci un attimo sopra e vedrai ..... la luce

    Bene capita questa cosa se tu metti &function ...quando la funzione termina quello che restituisci non sara' una copia o valore che poi vai ad usare ma sarà a sua volta un puntatore o riferimento alla relativa variabile.

  3. #3
    Utente di HTML.it L'avatar di LuckySevenRoX
    Registrato dal
    Sep 2011
    residenza
    Foligno
    Messaggi
    361
    ciao, intanto ti ringrazio per la risposta.
    La prima parte mi era già chiara, ho già lavorato con variabili passate per riferimento, quello che non mi convince come dicevo sopra però è la parte relativa al "&" prima di una funzione..
    tu dici:
    Originariamente inviato da Virus_101

    Bene capita questa cosa se tu metti &function ...quando la funzione termina quello che restituisci non sara' una copia o valore che poi vai ad usare ma sarà a sua volta un puntatore o riferimento alla relativa variabile.
    mi sta bene che la funzione ritorni non un valore ma un puntatore a una variabile.. ma.. quale variabile? cioè la funzione crea in automatico una variabile con il risultato delle operazioni e quindi viene restituito il puntatore a questa variabile? ma anche se fosse qual'è l'utilità di questa cosa? tanto invocando la stessa funzione più volte il risultato cambia comunque, a cosa mi serve un puntatore a un risultato di funzione?

    Riesci a mostrarmi un esempio di utilità di questa cosa?

    Ti rivedrò in un'altra vita…quando saremo tutti e due gatti...

  4. #4
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Codice PHP:


    function &doStuff()
    {
          
    $pippo "sono una variabile impostata internamente alla funzione faicose" ;
          return 
    $pippo;
    }


    $v doStuff();

    echo 
    $v 
    Quello che cambia all fine e' che passi un riferimento alla variabile invece del suo valore.
    Queste cose sono comode quando lavori con OOP o se devi ritornare grandi qauntita' di dati, il tempo in quei casi e' critico e quinid inveed di ritornare un'area di memoria con array multidimensionali di enorme dimensione, una volta allocati internamente alla funzione /metodo non fai altro che restituirne il puntatore (moooolto piu' performate).

  5. #5
    Utente di HTML.it L'avatar di LuckySevenRoX
    Registrato dal
    Sep 2011
    residenza
    Foligno
    Messaggi
    361
    ah quindi in questo caso la variabile locale 'pippo' rimane in memoria e si risparmia del tempo perchè la variabile 'v' non prende una "copia" di pippo ma punta direttamente al suo indirizzo di memoria..

    generalmente però le variabili locali vengono deallocate alla fine della funzione no? in questo caso l'unica che non viene deallocata è quella che viene messa come return?

    Magari sto facendo confusione, ma vorrei capire al meglio la cosa!
    Ti rivedrò in un'altra vita…quando saremo tutti e due gatti...

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    esatto come dici te, ma attenzione al garbage collecting.

    - La var viene allocata in memoria nella funzione
    - viene resituito il suo puntatore
    - il chiamante alloca tale puntatore in un'altra variabile
    - i dati allocati sono disponibile a partire dalla val allocata al punto precedente.
    - il garbage collector non dealloca la mem in quanto ancora referenziata dalla var

    Attenzione che
    - la mem viene pulita a termine dello script oppure quando usi "unset($var)"

    Ora se vuoi approfondire dai un occhio qui :
    http://php.net/manual/en/features.gc.php

    Nel caso in cui appunto restituisci un puntatore risparmi il tempo di passaggio per valore, se i dati sono molti ottimizzi il codice passando solamente 1 puntatore invece che tutta la struttura dati.

  7. #7
    Utente di HTML.it L'avatar di LuckySevenRoX
    Registrato dal
    Sep 2011
    residenza
    Foligno
    Messaggi
    361
    Ok ho le idee un pò più chiare adesso, thanks! Cercherò di approfondire cmq
    Ti rivedrò in un'altra vita…quando saremo tutti e due gatti...

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497

    ottimo dacci sotto nel caso siamo qua

  9. #9
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Nota bene: Con PHP5 gli oggetti si comportano un po' diversamente.

    http://php.net/manual/en/language.oop5.references.php

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.