PHP Funktionsweise des Parsers

M

Mr. Snoot

Gast
Hio,

eigentlich dachte ich mir, der PHP-Code wird so, wie er vorliegt abgearbeitet. D.h. der Parser geht Zeile für Zeile durch den Code und trifft bspw. auf eine if-Anweisung. Dort überprüft er dann die Bedingung und führt Code nur aus, wo die Bedingung eben erfüllt ist. Doch tatsächlich verhält es sich so, dass der Parser auch Code-Teile anschaut, die eigentlich gar nicht eintreten (also bspw. eine nicht erfüllte Bedingung).

Man hat z.B. folgenden Code:
PHP:
<?php

  $i = 1;

  if($i == 1)
  {
    # irgendwas
  }
  else
  {
    <fehlerhafter Code>
  }

?>
Nun wird das Script einen Fehler bzgl. <fehlerhafter Code> ausspucken, obwohl der else-Fall hier ja gar nicht eintreten kann.


Das ist einerseits natürlich schön, weil man so Fehler findet. Aber ist es auf der anderen Seite nicht mitunter höchst inperformant?

Denn der Parser klappert ja offenbar in jedem Fall den kompletten Code ab, und das kann ja u.U. ein wahnsinnig langes Script sein, welches aber wegen einer if-Anweisung gar nicht ausgeführt werden muss. Oder passiert das einfach so schnell, dass es in jedem Fall egal ist?
 
Mr. Snoot schrieb:
Das ist einerseits natürlich schön, weil man so Fehler findet. Aber ist es auf der anderen Seite nicht mitunter höchst inperformant?
Nicht zutreffende Verzweigungen werden zwar syntaktisch überprüft, aber nicht ausgeführt.

Sie MÜSSEN interpretiert werden, damit PHP erkennt, wo deren Ende im Quellcode ist. Und ein } in einem String würde eben bedeuten, dass das } eben NICHT den Anweisungs-Block schließt, sondern in einem Literal enthalten ist.

Das bedeutet, dass die Ausführung des Quellcodes nicht bereits beim Einlesen sondern danach statt findet. PHP baut so die internen Strukturen zur Ausführung auf (vergleichbar mit einem JIT-Compiler) und führt den Code dann aus.


Mit anderen Worten - es erscheint inperformant - aber genau das Gegenteil ist der Fall.
 
Zurück
Oben