Warum war GOTO in PHP 5 enthalten? [geschlossen]

8

Ich habe vor einiger Zeit festgestellt, dass das Schlüsselwort GOTO control in PHP 5.3.0 eingeführt wurde.

http://php.net/manual/en/control-structures.goto.php

Warum ist das geschehen?

Was sind die Ziele des Sprachdesigns dahinter?

Hat die PHP-Entwickler-Community danach gefragt?

Tulains Córdova
quelle
10
Ich sehe kein Problem mit goto wirklich. Ich wirklich nicht. Dennoch scheinen die Leute es zu verabscheuen, obwohl es selbst in Fällen, in denen es den Code vereinfachen würde , fast nie verwendet wird. Ja, es hat gute Verwendungsmöglichkeiten, unabhängig davon, ob Sie es gewohnt sind, gotodie Quelle einzulesen oder nicht. Ob sie oft in idiomatischem Code vorkommen oder nicht, ist eine andere Sache. Springen verursacht jedoch keinen Schaden.
zxcdw
7
Finite-State-Maschinen sind ein bisschen einfacher zu codieren, wenn Sie haben goto.
Yannis

Antworten:

22

Die verantwortliche Person gibt den Grund für das Hinzufügen in diesem Blog-Beitrag an .

[D] Das Projekt, an dem ich gearbeitet habe (und das ich vielleicht eines Tages wieder aufnehmen werde), war ein Workflow-basierter Site Builder […] zum Erstellen dynamischer Websites ohne Kenntnis einer Programmiersprache. Sie erstellen alle Metainformationen darüber, wie Ihre Site ausgeführt werden soll, und der Site-Builder „kompiliert“ diese in PHP-Code, der auf dem tatsächlichen Server ausgeführt wird.

Es kann ohne GOTO durchgeführt werden, aber die resultierende Logik für die besonders komplexen Teile der Geschäftslogik wird damit viel einfacher.

Zur Verteidigung von PHP können Sie nur innerhalb eines begrenzten Bereichs zu Beschriftungen springen, wodurch der mögliche Schaden begrenzt wird.

(Sie könnten auch argumentieren, dass angesichts der Art und Weise, wie PHP anscheinend jedes Konstrukt aus jeder jemals erfundenen Programmiersprache absorbiert hat, das Hinzufügen von gotoeinfach unvermeidlich war)

Grahamparks
quelle
19
Also wurde es für ein Projekt gemacht, an dem er nicht mehr arbeitet ... Süß.
Robert Harvey
Ja Kapitän! every construct from every programming language ever invented! ...Bis zur Unendlichkeit und weiter! (und zu denken, dass sie das von Perl 5 gesagt haben ... Ich bin so stolz auf diesen immer größer werdenden kleinen Unsinn namens PHP)
ZJR
13

Auf einer niedrigeren Ebene hatte PHP gotoseit PHP 4. Mit PHP 4 wurde der Interpreter überarbeitet und die Zend Engine eingeführt, die einen Compiler enthält, der bis zu "Opcodes" auf niedriger Ebene kompiliert, die an einen Executor übergeben werden.

Auf dieser Ebene ist eine Sprungoperation für alle verwendet if, switchoder beliebige Schleifenanweisungen. Mit PHP 5.3 wurde beschlossen, das gotonach langer Diskussion unter dem Namen zu exportieren .

Die Hauptgründe waren:

  • Es kann ohne Kosten gemacht werden (wir hatten es sowieso schon intern)
  • Dies kann beim Schreiben von Codegeneratoren hilfreich sein
  • Manchmal kann es hilfreich sein, mit Fehlerbehandlungscode aufzuräumen.

Die ersten beiden Punkte müssen möglicherweise nicht erklärt werden, und im dritten Teil geht es um Situationen wie diese:

 function do() {
     $lock = $acquire_lock...)
     if (!do_something()) {
         goto cleanup
     }
     if (!do_more()) {
          goto cleanup;
     }
  cleanup:
  free_lock($lock);

Natürlich gibt es in PHP nur wenige solcher Situationen, da PHP über ein Garbage Collection-System mit Referenzzählung verfügt, das solche Variablen und zugehörigen Ressourcen vorhersehbar freigibt. Dennoch solche Situationen existieren , in denen entweder Entwickler die Sanierung Code mehrfach oder Missbrauch d dupliziert do { } while (0);mit breakals gotoEmulation.

Um Missbrauch zu verhindern, wurde die Implementierung so eingeschränkt, dass Sie nicht in Schleifen springen können. Ein "Missbrauch" des berühmten Duff's Device ist also nicht möglich.

Am Ende wird PHP entwickelt, um Probleme zu lösen. Es schützt Sie nicht vollständig vor dem Schießen in Ihrem eigenen Fuß. Sie können viele Funktionen auf eine viel schlimmere Weise als diese eingeschränkte missbrauchen goto. Die Schlussfolgerung war also, dass es Randfälle gibt, in denen es nützlich ist und Probleme lösen kann.

johannes
quelle
2
Aufräumen? Ernsthaft? Warum nicht einfach ein echtes try-finallyKonstrukt implementieren ? (Hat PHP eine?)
Mason Wheeler
3
@ MasonWheeler PHP wurde vor finallyrelativ kurzer Zeit und danach goto.
Yannis
3
Nun, es gibt Leute, die keine Ausnahmen mögen, aber gehen. Es ist eine freie Welt ;-)
Johannes
7
Und übrigens. Als Release Master von PHP 5.3 übernehme ich die volle Verantwortung für diese Entscheidung :-)
Johannes
5

Man kann schlechten Code in jeder Sprache schreiben. Nachdem gotoin der Sprache bedeutet nicht , die Sprache schlecht ist.

Betrachten wir die bestehenden Strukturen in verschiedenen Sprachen - Pause , continue, next, zuletzt , throw. Auch switch dies sind alles Formen eines berechneten Gangs, die von einer Ebene des Bereichs zu derselben oder einer höheren Ebene des Bereichs gehen.

Das Problem mit goto ist, wenn es in eine tiefere Ebene des Bereichs eintritt oder Stapelrahmen überspringt.

Man wird das Beispiel 3 im verknüpften Dokument aus der Frage vermerken:

<?php
goto loop;
for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    loop:
  }
}
echo "$i = $i";
?>

Dies funktioniert nicht, da gotoversucht wird, in eine tiefere Ebene des Bereichs zu springen.

Es ist nichts Falsches an verschiedenen Formen von eingeschränktem goto, sei es das Schlüsselwort goto oder ein anderer Verzweigungsname. Die Alternativen (hässliche Bedingungen für for-Schleifen) können oft schlechter sein. Wie es ist, vereinfacht die Verwendung von goto das

Persönlich mag ich das Beispiel als Beispiel Nr. 1 nicht

<?php
goto a;
echo 'Foo';

a:
echo 'Bar';
?>

Dies verursacht jedoch keine anderen Probleme mit der Sprache als die Notwendigkeit, dem Entwickler, der absichtlich Code wie diesen schreibt, irgendeine Form von körperlicher Lernerfahrung zuzuweisen.


quelle
4
+1: vor allem "in die Sprache zu gehen bedeutet nicht, dass die Sprache schlecht ist"
Deco