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?