PHP erlaubt ungültigen Code in switch-Anweisungen

8

Ich habe Probleme zu verstehen, warum das Folgende in 5.3.3 nicht zu einem Compilerfehler führt (Fehler bei meinen Mitarbeitern 5.2.5):

%Vor%

Anstatt mir einen Compilerfehler (oder sogar eine Warnung) zu geben, gibt es nur folgendes:

%Vor%

Wenn ich es jedoch in einer if-Anweisung verwende, gibt es mir das, was ich erwarten würde:

%Vor%

gibt:

%Vor%

Warum ist das? Gibt es irgendwo eine Einstellung, die ich deaktivieren kann, um zu sagen, dass sie in dieser Sache streng ist?

    
Jeremy Logan 08.07.2011, 20:57
quelle

3 Antworten

4
___ qstnhdr ___ PHP erlaubt ungültigen Code in switch-Anweisungen ___ qstntxt ___

Ich habe Probleme zu verstehen, warum das Folgende in 5.3.3 nicht zu einem Compilerfehler führt (Fehler bei meinen Mitarbeitern 5.2.5):

%Vor%

Anstatt mir einen Compilerfehler (oder sogar eine Warnung) zu geben, gibt es nur folgendes:

%Vor%

Wenn ich es jedoch in einer if-Anweisung verwende, gibt es mir das, was ich erwarten würde:

%Vor%

gibt:

%Vor%

Warum ist das? Gibt es irgendwo eine Einstellung, die ich deaktivieren kann, um zu sagen, dass sie in dieser Sache streng ist?

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123switchstatement ___ In der Computerprogrammierung ist eine switch-, case-, select- oder inspect-Anweisung eine Art von Auswahlkontrollmechanismus ___ antwort6630482 ___

Es könnte möglicherweise nur als ein anderes Label interpretiert werden (was sinnvoll ist, da theoretisch case ein Label ist und case auch als eine spezielle Art von Label interpretiert werden könnte) könnte mit default: verwendet werden. Probiere } aus und finde es heraus. Ich würde, aber ich habe nicht PHP 5.3.3, sorry.

    
___ antwort6630519 ___

Das Problem ist, dass Ihr Code nicht das tut, was Sie denken. Ein defalut -Block endet erst, wenn der nächste case 2: -Block auftritt, oder wenn switch (2) gefunden wird oder wenn der schließende goto erreicht ist. Dies bedeutet, dass word: Teil des Blocks goto ist. So wird es nie auch nur interpretiert.

Es wird jedoch nicht einmal ein Syntaxfehler ausgelöst (nicht einmal, wenn Sie goto defalut; ausführen. Dies liegt daran, dass switch Operator wurde in PHP 5.3 eingeführt. Die Syntax case defalut am Anfang einer PHP-Anweisung ist nun ein Ziel, auf das über %code% zugegriffen werden kann. So kann %code% verwendet werden, um zu gehen das Etikett.

(Eigentlich kann es nicht, wegen einer Beschränkung auf Ziele in %code% Blöcke, um Endlosschleifen zu vermeiden, aber dies sollte den Punkt veranschaulichen ...)

Sie können einen Fehler erzwingen, indem Sie %code% ausführen, wenn der erwartete Fehler gefunden wird.

    
___ answer6630581 ___

Interessant, bei meiner 5.3.2 schlägt dies fehl IF es gibt KEINE andere Groß- / Kleinschreibung über der falschen Vorgabe.

Dies endet mit einem Syntaxfehler "T_UNEXPECTED_STRING":

%Vor%

Das funktioniert:

%Vor%

Es scheint, dass Sie einen Fehler im PHP-Parser gefunden haben. Wäre kein ernsthafter Fehler, aber trotzdem ein Fehler.

    
___
lonesomeday 08.07.2011, 21:06
quelle
8
___ qstnhdr ___ PHP erlaubt ungültigen Code in switch-Anweisungen ___ qstntxt ___

Ich habe Probleme zu verstehen, warum das Folgende in 5.3.3 nicht zu einem Compilerfehler führt (Fehler bei meinen Mitarbeitern 5.2.5):

%Vor%

Anstatt mir einen Compilerfehler (oder sogar eine Warnung) zu geben, gibt es nur folgendes:

%Vor%

Wenn ich es jedoch in einer if-Anweisung verwende, gibt es mir das, was ich erwarten würde:

%Vor%

gibt:

%Vor%

Warum ist das? Gibt es irgendwo eine Einstellung, die ich deaktivieren kann, um zu sagen, dass sie in dieser Sache streng ist?

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123switchstatement ___ In der Computerprogrammierung ist eine switch-, case-, select- oder inspect-Anweisung eine Art von Auswahlkontrollmechanismus ___ antwort6630482 ___

Es könnte möglicherweise nur als ein anderes Label interpretiert werden (was sinnvoll ist, da theoretisch default ein Label ist und case auch als eine spezielle Art von Label interpretiert werden könnte) könnte mit goto verwendet werden. Probiere goto aus und finde es heraus. Ich würde, aber ich habe nicht PHP 5.3.3, sorry.

    
___ antwort6630519 ___

Das Problem ist, dass Ihr Code nicht das tut, was Sie denken. Ein %code% -Block endet erst, wenn der nächste %code% -Block auftritt, oder wenn %code% gefunden wird oder wenn der schließende %code% erreicht ist. Dies bedeutet, dass %code% Teil des Blocks %code% ist. So wird es nie auch nur interpretiert.

Es wird jedoch nicht einmal ein Syntaxfehler ausgelöst (nicht einmal, wenn Sie %code% ausführen. Dies liegt daran, dass %code% Operator wurde in PHP 5.3 eingeführt. Die Syntax %code% am Anfang einer PHP-Anweisung ist nun ein Ziel, auf das über %code% zugegriffen werden kann. So kann %code% verwendet werden, um zu gehen das Etikett.

(Eigentlich kann es nicht, wegen einer Beschränkung auf Ziele in %code% Blöcke, um Endlosschleifen zu vermeiden, aber dies sollte den Punkt veranschaulichen ...)

Sie können einen Fehler erzwingen, indem Sie %code% ausführen, wenn der erwartete Fehler gefunden wird.

    
___ answer6630581 ___

Interessant, bei meiner 5.3.2 schlägt dies fehl IF es gibt KEINE andere Groß- / Kleinschreibung über der falschen Vorgabe.

Dies endet mit einem Syntaxfehler "T_UNEXPECTED_STRING":

%Vor%

Das funktioniert:

%Vor%

Es scheint, dass Sie einen Fehler im PHP-Parser gefunden haben. Wäre kein ernsthafter Fehler, aber trotzdem ein Fehler.

    
___
Ry︁ 08.07.2011 21:01
quelle
1

Interessant, bei meiner 5.3.2 schlägt dies fehl IF es gibt KEINE andere Groß- / Kleinschreibung über der falschen Vorgabe.

Dies endet mit einem Syntaxfehler "T_UNEXPECTED_STRING":

%Vor%

Das funktioniert:

%Vor%

Es scheint, dass Sie einen Fehler im PHP-Parser gefunden haben. Wäre kein ernsthafter Fehler, aber trotzdem ein Fehler.

    
Marc B 08.07.2011 21:12
quelle

Tags und Links