Newsgroup: it.comp.www.php
Titolo: passaggio per riferimento genera fatal error in php 5.4: esistono best practices per refactoring codice?

salve.
 
devo mettere mano a delle procedure php scritte da altri prima di php 5.4(assai prima), quando il passaggio di variabili per riferimento (&$var), sia pure deprecato, era tollerato (veniva generato un warning tacitabile).  in queste procedure si fa appunto uso qua e là di passaggi per riferimento.
 
come saprete con php 5.4 viene a mancare il supporto del passaggio per riferimento, il cui uso genera un errore fatale.
 
per il lavoro di cui mi sto occupando ho il vincolo di usare php 5.4 (il che è poi anche il motivo che ha richiesto il mio intervento).
 
per il momento l'unico escamotaggio che mi è venuto in mente per simulare, diciamo così, il passaggio per riferimento, è quello di modificare ogni funzione che ne fa uso: faccio restituire tramite return un array di variabili che sarebbero state modificate all'interno della funzione, e riassegno fuori dalla funzione tali valori modificati.
 
ad esempio, ammettiamo che questo sia il vecchio codice (chiaro che non si risolverebbe la cosa così, è solo per fare un esempio al volo.  inoltre scrivo a memoria, può darsi ci siano imperfezioni ma dovrebbe essere tutto chiaro):
 
 
 
$test_pari_dispari = "pari oppure dispari"; 
$numero = 23; 
 
function verifica(&$test_pari_dispari, $numero) {
  if (($numero mod 2) == 0) { 
    $test_pari_dispari = "pari";
  } else {
    $test_pari_dispari = "dispari";
  }
  return date('H:i:s'); 
}
 
$adesso = verifica(&$test, $numero); 
 
echo "alle ore " . $adesso . " ho verificato che il numero " . $numero . " è " . $test_pari_dispari; 
 
 
 
potendo usare il passaggio per riferimento, l'output di echo sarebbe qualcosa tipo "alle ore 12:23:05 ho verificato che il numero 23 è dispari" e saremmo tutti contenti.
 
non potendolo usare, modificherei la funzione in questo modo:
 
 
 
$test_pari_dispari = "pari oppure dispari"; 
$numero = 23; 
 
// lascio negli argomenti la variabile $test_pari_dispari, 
// in questo contesto inutile,
// solo per memoria storica e per non appesantire la riscrittura 
// di tutte le chiamate
 
function verifica($test_pari_dispari, $numero) {
 
  if (($numero mod 2) == 0) { 
    $test_pari_dispari = "pari";
  } else {
    $test_pari_dispari = "dispari";
  }
 
  $array_variabili_modificate = array();
  $array_variabili_modificate['test_pari_dispari'] = $test_pari_dispari; 
  $array_variabili_modificate['adesso'] = date('H:i:s'); 
 
  return $array_variabili_modificate; 
}
 
$array_nuovi_valori = verifica($test_pari_dispari, $numero); 
 
$test_pari_dispari = $array_nuovi_valori['test_pari_dispari'];
$adesso = $array_nuovi_valori['adesso'];
 
echo "alle ore " . $adesso . " ho verificato che il numero " . $numero . " è " . $test_pari_dispari; 
 
 
 
ad occhio dovrebbe funzionare, quello che mi domandavo è se ci fossero best practices o altri sistemi consolidati per risolvere la faccenda.
 
grazie.

 come saprete con php 5.4 viene a mancare il supporto del passaggio per riferimento, il cui uso genera un errore fatale.
 
Non proprio.
 
È stata rimossa la possibilità di decidere a call-time se passare per 
riferimento, ma le funzioni possono definire parametri che vengono 
passati per riferimento.
 
In questo caso:
 
function verifica(&$test_pari_dispari, $numero) {
   if (($numero mod 2) == 0) {
     $test_pari_dispari = "pari";
...
}
 
$adesso = verifica(&$test, $numero);
 
 
Ti basta cambiare la chiamata così:
 
$adesso = verifica($test, $numero);
 
Senza cambiare la definizione della funzione.
 
Bye.
 

 Senza cambiare la definizione della funzione.
 
grazie!