Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > it.comp.www.php > #21061 > unrolled thread

passaggio per riferimento genera fatal error in php 5.4: esistono best practices per refactoring codice?

Started by"lbo@email.it" <lbo@email.it>
First post2016-07-29 03:50 -0700
Last post2016-07-29 07:14 -0700
Articles 3 — 2 participants

Back to article view | Back to it.comp.www.php


Contents

  passaggio per riferimento genera fatal error in php 5.4: esistono best practices per refactoring codice? "lbo@email.it" <lbo@email.it> - 2016-07-29 03:50 -0700
    Re: passaggio per riferimento genera fatal error in php 5.4: esistono best practices per refactoring codice? Alessandro Pellizzari <shuriken@amiran.it> - 2016-07-29 12:30 +0100
      Re: passaggio per riferimento genera fatal error in php 5.4: esistono best practices per refactoring codice? "lbo@email.it" <lbo@email.it> - 2016-07-29 07:14 -0700

#21061 — passaggio per riferimento genera fatal error in php 5.4: esistono best practices per refactoring codice?

From"lbo@email.it" <lbo@email.it>
Date2016-07-29 03:50 -0700
Subjectpassaggio per riferimento genera fatal error in php 5.4: esistono best practices per refactoring codice?
Message-ID<0b9e2c54-ee6d-4092-814c-77529bd0ab6f@googlegroups.com>
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.

[toc] | [next] | [standalone]


#21062

FromAlessandro Pellizzari <shuriken@amiran.it>
Date2016-07-29 12:30 +0100
Message-ID<e00t27F8tuhU1@mid.individual.net>
In reply to#21061
On 29/07/2016 11:50, lbo@email.it wrote:

> 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.

[toc] | [prev] | [next] | [standalone]


#21063

From"lbo@email.it" <lbo@email.it>
Date2016-07-29 07:14 -0700
Message-ID<2484aaa1-eb6e-4230-b450-8efe757e3053@googlegroups.com>
In reply to#21062
Il giorno venerdì 29 luglio 2016 13:30:18 UTC+2, Alessandro Pellizzari ha scritto:

> È stata rimossa la possibilità di decidere a call-time se passare per 
> riferimento, ma le funzioni possono definire parametri che vengono 
> passati per riferimento.

...
> Ti basta cambiare la chiamata così:
> 
> $adesso = verifica($test, $numero);
> 
> Senza cambiare la definizione della funzione.

grazie!

[toc] | [prev] | [standalone]


Back to top | Article view | it.comp.www.php


csiph-web