Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [PHP] Problemino concettuale con i riferimenti

    Mi sento vagamente fesso perché sono sicuro che sia una scemenza, ma al momento mi sfugge il perché di questo comportamento:
    Codice PHP:
    function prova(&$vett)
    {
        echo 
    'Inizio Prova: '.print_r($vettTRUE)."
    "
    ;
        
    $vett = &$vett['a'];
        
    $vett = &$vett['a2'];
        echo 
    'Fine Prova: '.print_r($vettTRUE)."
    "
    ;
    }
    $a = array('a' => array('a1' => 5'a2' => array('a3' => 10)));
    $b = &$a;
    echo 
    'Prima: '.print_r($bTRUE)."
    "
    ;
    prova($b);
    echo 
    'Dopo: '.print_r($bTRUE)."
    "

    Stampa:
    Prima: Array ( [a] => Array ( [a1] => 5 [a2] => Array ( [a3] => 10 ) ) )
    Inizio Prova: Array ( [a] => Array ( [a1] => 5 [a2] => Array ( [a3] => 10 ) ) )
    Fine Prova: Array ( [a3] => 10 )
    Dopo: Array ( [a] => Array ( [a1] => 5 [a2] => Array ( [a3] => 10 ) ) )
    Essendo il parametro formale di prova() per riferimento, mi aspetterei che il valore di $vett assegnato dentro la funzione impostasse anche quello del parametro attuale $b, invece subito dopo la funzione $b è invariato, pur avendolo passato per riferimento a una funzione che lo modifica. Se dentro prova() gli assegno un valore invece che un altro riferimento tutto funziona come previsto.
    Perché? :master:

  2. #2
    forse dico una sciuocchezza, ma in PHP quando passi per riferimento più di una volta è come se cambiassi il puntatore, nel senso ciò a cui stai puntando, e non l'oggetto puntato, quindi:

    Codice PHP:
    $b = & $a ;
    // $a ed $b puntano entrambi direttamente al tuo array

    prova($b); 
    // adesso $a, $b, $vett puntano tutti direttamente all'array

    // dentro la funzione 
    $vett = & $vett['a'];
    // ora $vett punta direttamente all'elemento $a['a']
        
    $vett = &$vett['a2']; 
    // ora $vett punta direttamente all'elemento $a['a2']
    // e stampa per l'appunto $a['a2']
    // terminata l'esecuzione della funzione $vett muore senza che sia stato modificato nulla 
    Insomma una cosa del genere
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  3. #3
    non credo sia un problema di vita della variabile. Piuttosto, io l'ho capita così:
    se a $vett assegno un nuovo riferimento non lo sto assegnando anche alla variabile da lui riferita (cioè a $b), bensì lo lo sto "slegando" dalla variabile iniziale (che continua infatti per i fatti propri) e facendolo diventare un riferimento a un'altra cosa. Alla fine della funzione il $vett che inizialmente riferiva la variabile $b, riferisce qualcos'altro, ed è per questo che la variabile esterna non viene aggiornata di conseguenza.

  4. #4
    Si, si, era quello che intendevo io, lo scope della variabile non c'entra. Le diverse variabili rimangono indipendenti tra loro anche se riferite allo stesso oggetto, quindi cambiando riferimento ad una variabile le altre variabili continueranno a riferirsi al vecchio oggetto.
    Detto questo mi sa che cmq è il caso che mi riguardi la logica dei puntatori, che mi sono accorto di non ricordami più una beneamata ...
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  5. #5

  6. #6
    Originariamente inviato da bubu77
    http://it.php.net/manual/it/language...nces.arent.php
    giusto, c'avevo l'esempio sotto al naso... avevo ragione a sentirmi fesso

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.