Con PHP 5.3 torna l’incubo del goto

di Andrea Turso - 11 gennaio 2009

Nonostante anni di sforzi per combattere l’utilizzo di bad practices, il dev team di PHP sa come distinguersi dalla massa. “No, non può essere vero” è stato il mio primo pensiero quando ho letto nel blog di uno degli sviluppatori di PHP che il regalo di Natale quest’anno sarebbe stato l’introduzione del costrutto goto con PHP 5.3.

Dopo il più o meno noto “Go To Statement Considered Harmful” — sollevato dal grande Dijkstra — il dev team di PHP ha pensato bene di continuare la sua corsa per rendere PHP il linguaggio più idiota ed incoerente del pianeta. Ormai siamo al delirio.

Che sia la volta di passare definitivamente a Ruby? Può darsi. Ormai è appurato che il dev team di PHP decide per se e l’opinione della community ormai non conta più come un tempo.

Forse dovrò dare ragione a chi mi disse che PHP non potrà mai essere un linguaggio adatto per il settore enterprise.

6 commenti

1 Oliviero Oliviero lunedì 12 gennaio 2009, ore 20:12
No non ci credo! Cosa vuol dire?! non ha senso!

Tra l’altro il costrutto goto a cosa potrebbe servire, dal momento che con la programmazione OOP si è elaborato un metodo diverso e completamente innovativo rispetto a quella procedurale… e che ci permette appunto di organizzare tutto non secondo perazioni in sequenza… il goto è inutile!

E la community? si fa sentire? è vero… non conta più come prima.
2 Roberto Roberto mercoledì 14 gennaio 2009, ore 08:08
Mica c’è scritto che lo devi utilizzare per forza! E poi anche C# e altri linguaggi hanno il costrutto GOTO. La visione di Dijkstra del 1968 ha una sua validità (a dire il vero un po’ accademica), ma dopo aver sperimentato che l’OOP non può andar bene sempre e comunque e che la programmazione strutturata ha i suoi limiti, in alcuni casi il goto permette di scrivere codice ottimizzato.

Del resto mi sembra che PHP sia poco puro per tanti altri aspetti, o no?

PHP è un linguaggio estremamente comodo perché molto scrivibile, ma rischia di essere poco leggibile. Del resto Java (ad esempio) è poco scrivibile, ma estremamente leggibile.

Insomma tutto non si può avere ed il GOTO non mi sembra un delirio.

ciao
3 Andrea Turso Andrea Turso mercoledì 14 gennaio 2009, ore 08:42
Eheh, è chiaro che abbiamo due visioni completamente diverse, anche se in parte condivido quello che dici, c’è da considerare il fatto che se c’è uno strumento, che per sua natura è dannoso (se non utilizzato correttamente) e dannatamente potente, sta’ tranquillo che la maggioranza della popolazione che utilizzerà tale strumento lo farà in modo dannoso, c’è persino la possibilità che lo renda più dannoso di quanto sia di sua natura.

Il delirio si riferisce al fatto che la reputazione di PHP sta precipitando nella comunità di sviluppatori che potrebbero utilizzarlo per scopi “seri” (il settore enterprise, ad esempio) a causa delle scelte — a mio parere, e non solo — assurde che il dev-team sta facendo senza senno e senza consultare la community.

È altresì vero che PHP è nato con lo scopo di essere uno strumento di supporto alla risoluzione di problemi assillanti nello sviluppo di applicazioni web, e che la totalità delle sue caratteristiche ci sono perché servivano, ma siamo sinceri: sono trent’anni che nessuno ha bisogno del GOTO. Lo stessa persona che ha proposto l’aggiunta sul suo blog propone un esempio di utilizzo del GOTO facilmente risolvibile in maniera differente senza ricorrere al GOTO. Sarebbe stato sufficiente utilizzare il più coerente costrutto try … catch … finally, ecco questa è una richiesta che la community sta facendo da tempo ma nessuno ancora sembra voler degnare della dovuta attenzione, segno secondo me della scarsa considerazione della community.

Ciao
4 Alessio Alessio martedì 15 settembre 2009, ore 11:47
Voi non capite nulla!!! questo costrutto è utilissimo e ringrazio dio che lo hanno integrato finalmente

srand((double)microtime()*1000000);
a:
$num[0]= (rand(0,count($r)-1));
b:
$num[1]= (rand(0,count($r)-1));
c:
$num[2]=(rand(0,count($r)-1));

if ($num[1]==$num[0]){
goto b;
}

if ($num[2]==$num[1]){
goto c;
}

if ($num[2]==$num[0]){
goto c;
}

fatelo con gli elseif se siete capaci!!! non capite nulla e denigrate il goto... ignoranti
5 Jj Jj sabato 31 ottobre 2009, ore 17:11
@Alessio

quando imparerai ad usare i comandi while , do while e for , e riuscirai a comprende i significati di break e continue capirai che goto non serve a nulla
6 Andrea Turso Andrea Turso giovedì 3 dicembre 2009, ore 20:00
@Alessio: non agitiamoci, suvvia. Fa piacere vedere che ci tieni a PHP =)

Comunque girovagando nel backstage dello Zend Framework, Matthew Weier O'Phinney parlava della possibilità di utilizzare il goto per modificare il Dispatch loop del framework in modo da renderlo un Automa a numero di Stati Finiti (FSM):

"The reasons an FSM were considered were several. First, the front controller defines several distinct states already: routing, dispatching, and emitting the response; errors are also a distinct state, though currently muddled into the rest of the architecture. [...] A Finite State Machine largely solves these problems. If you need to go to another state, you simply goto it."

Per i golosi ecco qui il link al repository con il Proof of Concept del nuovo Zend Controller 2.0: http://github.com/weierophinney/phly/tree/mvcfsm/Phly_Mvc/library/phly/mvc/
Effettua l'accesso o registrati per inserire un commento