Visualizzazione risultati 1 fino 2 di 2

Discussione: Passaggio by-reference a funzione senza argomenti

  1. #1
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito Passaggio by-reference a funzione senza argomenti

    Ciao, come da titolo, sto cercando di passare una variabile by-reference a una funzione priva di argomenti.

    Edit: L'avevo scritto male, ora lo riscrivo.

    Diciamo che ho 2 funzioni, una priva di argomenti che chiama una seconda con passaggio per riferimento:
    Codice PHP:
    echo "Livello 0<br>\n";
    $a = 10;
    $b = 2;
    $c = chiama_funzione($a, $b);
    var_dump($c == $a);

    function
    chiama_funzione(){
    echo
    "Livello 1<br>\n";
    list(
    $c, $d) = func_get_args(); // Lo so che non funziona, ma è per far capire l'intento
    $res = moltiplica($c, $d);
    var_dump($res == $c);
    return
    $res;
    }

    function
    moltiplica(&$a, $b){
    echo
    "Livello 2<br>\n";
    $a *= $b;
    return
    $a; // La ridondanza è voluta, per verificare la propagazione del valore
    }
    Al "Livello 0" passo alla chiama_funzione() i valori che chiama_funzione() passerà a moltiplica().
    Al "Livello 1" avviene un passaggio per riferimento diretto, quindi la var_dump() darà "true", infatti il problema non è questo.
    Al "Livello 0", la var_dump() darà "false", infatti $c avrà il valore atteso (20), mentre $a avrà ancora il valore iniziale (10) perché la propagazione non è avvenuta.

    Ho usato due soluzioni per ottenere il passaggio per riferimento indiretto, ma hanno un inghippo:
    Codice PHP:
    SOLUZIONE 1: Versione multipla:

    add_reference($a); add_references($a, $b);
    chiama_funzione($a, $b); chiama_funzione($a, $b);
    $a = get_reference(); list($a, $b) = get_references();

    SOLUZIONE 2: // passaggio per riferimento durante la chiamata

    chiama_funzione(&$a, $b); chiama_funzione(&$a, &$b);
    $a = get_reference(); list($a, $b) = get_references();
    L'inghippo sta nel fatto che (per come l'ho implementato) devo scrivere ESATTAMENTE LA STESSA COSA in tutte le righe qui sopra. Esempio:
    Codice PHP:
    // questo funziona
    add_reference($a);
    chiama_funzione($a, $b);
    $a = get_reference();

    // anche questo funziona
    $s = 'a';
    add_reference($$s);
    chiama_funzione($$s, $b);
    $
    $s = get_reference();

    // questo NON funziona, nonostante $a e $$s siano sostanzialmente la stessa variabile
    $s = 'a';
    add_reference($$s);
    chiama_funzione($a, $b);
    $a = get_reference();

    // questo non funziona
    add_reference($a);
    chiama_funzione($a, $b);
    $c = get_reference(); // $c = NULL
    Sto quindi cercando di fare questa cosa nella maniera più "naturale" possibile Idee?
    Ultima modifica di Luffio : 09-10-2014 alle ore 10.15.04
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  2. #2
    L'avatar di saitfainder
    saitfainder non è connesso Sëniör Stäff
    Data registrazione
    06-12-2002
    Residenza
    Torino
    Messaggi
    8,715

    Predefinito

    Mi sfugge il senso di tutto ciò. Se una funzione non accetta parametri puoi solo pensare di agire sulle variabili globali, le altre sono al di fuori dello scope.


    «È una mia peculiarità distorcere la verità e inventarne di nuove.»
    «I tuoi orientamenti hanno su di me un effetto prossimo allo zero.»


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •