Ho scoperto qualche tempo fa che la parola chiave GOTO control era stata introdotta in PHP 5.3.0.
Perché è successo?
Quali sono gli obiettivi di progettazione linguistica alla base di questo?
La comunità di sviluppatori PHP l'ha richiesto?
Ho scoperto qualche tempo fa che la parola chiave GOTO control era stata introdotta in PHP 5.3.0.
Perché è successo?
Quali sono gli obiettivi di progettazione linguistica alla base di questo?
La comunità di sviluppatori PHP l'ha richiesto?
La persona responsabile fornisce il motivo per aggiungerla in questo post del blog .
[T]he project I was working on (and may pick back up someday) was a workflow based site builder […] for making dynamic websites without knowing a programming language. You build up all the meta-information about how your site should run, then the site-builder “compiles” that into PHP code that’ll run on the actual server.
It can be done without GOTO, but the resulting logic for the particularly complex bits of business logic become much simpler with it.
Nella difesa di PHP, ti consente solo di passare alle etichette in un ambito limitato, il che limita il danno che può essere fatto.
(Si potrebbe anche sostenere che dato il modo in cui PHP ha apparentemente assorbito ogni costrutto da ogni linguaggio di programmazione mai inventato, l'aggiunta di goto
era semplicemente inevitabile)
A un livello inferiore PHP aveva goto
da PHP 4. Con PHP 4 l'interprete è stato rifatto e il motore Zend è stato introdotto, che include un compilatore che compila fino a "opcodes" di basso livello che vengono consegnati a un esecutore.
Su quel livello viene utilizzata un'operazione di salto per tutti if
, switch
o qualsiasi istruzione loop. Con PHP 5.3 è stato deciso di esportarlo sotto il nome di goto
dopo una lunga discussione.
I motivi principali erano:
I primi due elementi potrebbero non aver bisogno di spiegazioni, e la terza parte riguarda situazioni come questa:
function do() {
$lock = $acquire_lock...)
if (!do_something()) {
goto cleanup
}
if (!do_more()) {
goto cleanup;
}
cleanup:
free_lock($lock);
Naturalmente in PHP ci sono poche situazioni di questo tipo, dato che PHP ha un sistema di raccolta dei rifiuti conteggiato di riferimento che renderà prevedibilmente libere tali variabili e risorse associate. Ciononostante esistono situazioni in cui gli sviluppatori hanno duplicato il codice di ripulitura più volte o hanno abusato di d do { } while (0);
con break
come goto
di emulazione.
Per impedire l'uso improprio, l'implementazione è stata limitata in modo da non poter entrare nei loop. Quindi "l'abuso" nel modo del famoso dispositivo di Duff non sarà possibile.
Alla fine, PHP è stato sviluppato per risolvere i problemi, non ti protegge completamente dagli spari del tuo stesso piede, puoi abusare di molte funzioni in modo peggiore di questo goto
limitato. Quindi, la conclusione è stata che ci sono casi limite in cui è utile e in grado di risolvere i problemi.
Si può scrivere codice cattivo in qualsiasi lingua. Avere goto
nella lingua non significa che la lingua sia cattiva.
Considera le strutture esistenti in varie lingue: pausa , continue
, next
, ultimo , throw
. Even switch
Queste sono tutte forme di un go di calcolo che vanno da un livello di scope allo stesso livello o ad un livello superiore di scope.
Il problema con goto è quando entra in un livello più profondo di scope o salta i frame dello stack.
Si noterà l'Esempio 3 nel documento collegato dalla domanda:
<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
while($j--) {
loop:
}
}
echo "$i = $i";
?>
Questo non funzionerà perché goto
sta tentando di passare a un livello più profondo di scope.
Non c'è nulla di sbagliato in varie forme di goto limitato, essere la parola chiave chiamata goto o qualche altro nome di diramazione. Le alternative (brutti condizionali nei cicli for) possono spesso essere peggiori. Così com'è, usando goto semplifica il
Personalmente, non mi piace l'esempio dato come esempio # 1
<?php
goto a;
echo 'Foo';
a:
echo 'Bar';
?>
Tuttavia, questo non causa problemi con la lingua se non la necessità di applicare qualche forma di esperienza di apprendimento corporale allo sviluppatore che scrive intenzionalmente un codice come questo.
Leggi altre domande sui tag control-structures language-design php goto structured-programming