Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > it.comp.www.php > #21061 > unrolled thread
| Started by | "lbo@email.it" <lbo@email.it> |
|---|---|
| First post | 2016-07-29 03:50 -0700 |
| Last post | 2016-07-29 07:14 -0700 |
| Articles | 3 — 2 participants |
Back to article view | Back to it.comp.www.php
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
| From | "lbo@email.it" <lbo@email.it> |
|---|---|
| Date | 2016-07-29 03:50 -0700 |
| Subject | passaggio 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]
| From | Alessandro Pellizzari <shuriken@amiran.it> |
|---|---|
| Date | 2016-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]
| From | "lbo@email.it" <lbo@email.it> |
|---|---|
| Date | 2016-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