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?
php
language-design
control-structures
goto
structured-programming
Tulains Córdova
quelle
quelle
goto
die Quelle einzulesen oder nicht. Ob sie oft in idiomatischem Code vorkommen oder nicht, ist eine andere Sache. Springen verursacht jedoch keinen Schaden.goto
.Antworten:
Die verantwortliche Person gibt den Grund für das Hinzufügen in diesem Blog-Beitrag an .
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
goto
einfach unvermeidlich war)quelle
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)Auf einer niedrigeren Ebene hatte PHP
goto
seit 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
,switch
oder beliebige Schleifenanweisungen. Mit PHP 5.3 wurde beschlossen, dasgoto
nach langer Diskussion unter dem Namen zu exportieren .Die Hauptgründe waren:
Die ersten beiden Punkte müssen möglicherweise nicht erklärt werden, und im dritten Teil geht es um Situationen wie diese:
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);
mitbreak
alsgoto
Emulation.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.quelle
try-finally
Konstrukt implementieren ? (Hat PHP eine?)finally
relativ kurzer Zeit und danachgoto
.Man kann schlechten Code in jeder Sprache schreiben. Nachdem
goto
in der Sprache bedeutet nicht , die Sprache schlecht ist.Betrachten wir die bestehenden Strukturen in verschiedenen Sprachen - Pause ,
continue
,next
, zuletzt ,throw
. Auchswitch
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:
Dies funktioniert nicht, da
goto
versucht 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
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