Newsgroup: it.comp.www.php
Titolo: Come scrivere questo codice in maniera più... elegante?

Vorrei iniziare a scrivere codice in maniera un pelino piů raffinata di 
quanto faccio attualmente (per hobby) alla luce di questo, qual'č secondo 
voi un modo piů "elegante" per scrivere quanto segue:
 
if(isset($_POST["tipo"]) && ($_POST["tipo"]) == 0) $var0= "selected" ;
if(isset($_POST["tipo"]) && ($_POST["tipo"]) == 1) $var1= "selected" ;
if(isset($_POST["tipo"]) && ($_POST["tipo"]) == 2) $var2= "selected" ; 
 
 


 
if (isset($_POST["tipo"]) {
	switch ($_POST["tipo"]) {
		case 0:
			$var0="selected"
			break;
		case 1:
			$var1="selected"
			break;
		case 2:
			$var2="selected"
			break;
		default:
			// Qui dovresti incazzarti perché la scelta
			// non ricade fra quelle possibili
			break;
	}
}
 
 

if(isset($_POST["tipo"]) && ($_POST["tipo"]) == 2) $var2= "selected" ; 
 
come minimo, e' inutile che tu ripeta ogni volta il test di isset, basta
una:
 
	if (isset($_POST['tipo']))
	{
		if (0 == $_POST['tipo'])	$var0 = 'selected';
		...
	}
 
Poi, se uno di quegli if si verifica, non potranno verificarsi tutti gli
altri, e allora:
 
		     if (0 == $_POST['tipo']	$var0 = 'selected';
		else if (1 == $_POST['tipo']	$var1 = 'selected';
		else if (2 == $_POST['tipo']	$var2 = 'selected';
 
oppure, piu' manutenibile, la scrittura che userei io:
 
	if (isset($_POST['tipo']))
	{
		switch($_POST['tipo'])
		{
			case 0:
				$var0 = 'selected';
				break;
			case 1:
				$var1 = 'selected';
				break;
			case 2:
				$var2 = 'selected';
				break;
			default:
				// Errore: tipo non previsto
		}
	}
 
Se vuoi fare il gagarone, considera che a tipo 0 corrisponde var0, ad 1
var1, eccetera; e allora:
 
	if (isset($_POST['tipo']))
	{
		switch($_POST['tipo'])
		{
			case 0: // Ma questo e' MENO manutenibile...
			case 1:
			case 2:
				${'var'.$_POST['tipo']) = 'selected';
				break;
			// Altri casi, che so: 3 seleziona var3 e var4;
			case 3:
				$var3 = 'selected';
				$var4 = 'selected';
				break;
			default:
				trigger_error("unknown tipo",
					E_USER_ERROR);
				break;
		}
	}
 
Leonardo
 
-- 
Tell us whether you spy, in the light of the morn,
what saluted was fiercely at the fall of the past day:
whose pips and whose bands in the very heart of the fray
bravely floated from the bulwarks to which we were sworn?


Gira la logica
 
if(isset($_POST['tipo'])){
	$varSelected = (int) $_POST['tipo'];
}
 
poi se vuoi ti fai un bello switch su $varSelected
M
-- 
I fatti mi cosano

Direi che avete ampiamente risposto alla mia domanda. :)
 
Grazie a tutti e 3, è un piacere leggervi.

 Grazie a tutti e 3, è un piacere leggervi.
 
Qui trovi alcune convenzioni per scrivere il codice in maniera
leggibile:
http://kohanaframework.org/3.2/guide/kohana/conventions
 
 
Ovvio non sono universali o obbligatorie


 
Prova così:
 
if (isset($_POST["tipo"])
	foreach (array(0, 1, 2) as $i)
		if ($_POST["tipo"] == $i)
			${'var' . $i} = 'selected';


auguri...

 auguri...
 
Perchè?


Credo che intendesse dire che hai cercato di risolvere il suo 
"microproblema" rendendolo forse ancora piu` illeggibile di prima :)
 
Secondo me non ha nemmeno senso cercare di abbellire quel codice. Va 
proprio ripensata la struttura del software, quindi bisogna sapere a un 
livello piu` alto cosa vorrebbe fare.
 
Bye.


Perché usando questa sintassi
${'var' . $i} = 'selected';
Finisci con l'avere variabili che si chiamano 
$varQUALSIASICOSACIFOSSENELPOST
 
Questa funzionalità può essere comoda in ridottissimi ambiti, dove ci 
sia possibilmente un robusto framework alle spalle che tenga conto della 
miriade di cagate che ne potrebbe scaturire e ci metta un freno
 
Di fatto tecniche simili sono usate per l'introspezione, per metodi 
automagici e via così
 
Usare questa tecnica per assegnare brutalmente un valore ottenuto 
tramite post ad una variabile dinamica è imho fuori luogo


 $varQUALSIASICOSACIFOSSENELPOST
 
Per dare a Cesare ecc. ecc., nel codice di Davide questo non succede, 
perche` $i puo` assumere solo i valori 0, 1 e 2 (dal foreach).
 
Ma il tuo e` un consiglio valido in tutti gli altri casi, e si riassume el 
dogma "mai fidarsi dei dati che arrivano dal browser".
 
Bye.


Infatti... io stavo per incollare lo stesso codice (ma essendo arrivato 
tardi ho evitato:P).
Francamente mi pare di gran lunga la soluzione + elegante.
 
-- 
Z.

 dogma "mai fidarsi dei dati che arrivano dal browser".
 
Giammai :) Il punto era proprio quello di utilizzare un array contenente 
i soli valori ammissibili.
 
Probabilmente è una soluzione sovradimensionata se quello che deve fare 
Treggi è solo controllare tre variabili... però è dinamica: se aumentano 
i valori è sufficiente aggiungerli nell'array e soprattutto non ho 
nessun codice duplicato.


Marò, ho avuto un attimo di effetto fnorg mi sa,
il forach sull'array() non l'avevo mica visto
 
M
 
-- 
I cosi mi fattano

 MarÃ², ho avuto un attimo di effetto fnorg mi sa,


 concordanti nell'ultimo else!
 
A meno che non sia dentro un ciclo o comunque venga eseguita centinaia di 
volte, non starei a guardare i microsecondi, anche perche` penso che la 
differenza tra una e l'altra sia dell'ordine dei nanosecondi.
 
Ma mi piacerebbe che Treggi ci spiegasse qual e` il vero problema, 
piuttosto che trovare soluzioni che probabilmente sono una piu` brutta 
dell'altra. :)
 
Bye.

 dell'altra. :)
 
Grazie a tutti per le risposte.
Non c'è un vero problema, non c'è chissà quale codice a monte ma solo una 
variabile passata in una pagina tramite il $_POST come scritto nel messaggio 
originale ed in base al valore della quale devo assegnare il "selected" di 
una option.
 
Tutto qui. Siccome m'è capitato altre volte e non mi sono fermato ad 
"ottimizzare" ora volevo sfruttare l'occasione per capire com'era meglio 
scrivere o non scrivere quelle righe.
 
 

 "selected" di una option.
 
Ah, ecco, vedi che c'era qualcosa di pratico sotto? ;)
 
 
if ( !is_numeric($_POST['tipo']) throw new Exception();
 
$selected = intval($_POST['tipo');
 
$options = array('0'=>'val 0', '1'=>'val 1',  '2'=>'val 2');
 
if ( !in_array($selected, array_keys($options))) throw new Exception();
 
?>
 
<select blabla>
 
 <?php foreach ($options as $value => $name): ?>
 
  <option value="<?php echo $value; ?>"
 
    <?php echo ($value==$selected) ? 'selected':''); ?>
 
  ><?php echo $name; ?></option>
 
 <?php endforeach; ?>
 
</select>
 
 
Ho "compresso" un po' per non sparare troppe righe, ma di solito uso 
blocchi anche per istruzioni singole, ed eccezioni "personalizzate" e con 
un messaggio di errore chiaro.
 
Bye.

 
 
io l'avrei scritto cosi.