Author: Progman, zuletzt bearbeitet von tittenmaus @ 2004/11/28 14:35:32
Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.
Abarbeitung von PHP
1. Parsen des Scriptes
Früher oder später werdet ihr in euren PHP-Scripten auf sogenannte Parse Errors stoßen. Bevor PHP eine Datei abarbeitet, wird das Dokument in seine Bestandteile aufgebröselt. Er guckt dann, welche Klammer zu welcher Klammer gehört, welches case zu welchem switch und so. Dies macht er, mehr oder weniger, Zeichen für Zeichen, bzw. Token für Token. Wie PHP das jetzt haargenau im inneren macht, ist uns jetzt erstmal egal. Eine Liste der Tokens findet man im PHP-Manual unter Anhang J. List of Parser Tokens .
Unabhänging von dem Inhalt, was das Script macht, wandelt PHP alle Teile in sogenannte Tokens um. Als beispiel haben wir diesen Code.
<?php
/*
* Hello World von Progman
*/
echo("Hello World");
foo(5); // eine andere Funktion
// ende des Scriptes
?>
Nun setzt sich PHP da dran, alle Teile in Tokens umzuwandeln. Zuerst wandelt er das Open-Tag <?php um.
T_OPEN_TAG
Danach wird der Mehrzeilige Kommentar umgewandelt.
T_OPEN_TAG T_ML_COMMENT
Das echo ist ein Sprachkonstruktur, es hat einen eigenen Token.
T_OPEN_TAG T_ML_COMMENT T_ECHO
Nach und nach kommen die einzelnen Tokens zusammen.
T_OPEN_TAG T_ML_COMMENT T_ECHO ( T_STRING ) ; T_STRING ( T_NUM ) ; T_COMMENT T_CLOSE_TAG
Ob das PHP jetzt genau so macht, weiß ich nicht. Nun prüft PHP ob die Tokens auch an der richtigen Stelle stehen. Nach dem T_ECHO darf z.B. eine Variable kommen, eine Konstante, ein String, eine Klammer auf, etc.. Diese Sachen setzt PHP nun als expected vorraus, also als erwartet. Alles andere ist da Fehl am Platz. Hier ein Beispiel
<?php
echo function;
?>
PHP wandelt das nun wie folgt um.
T_OPEN_TAG T_ECHO T_FUNCTION T_CLOSE_TAG
Hier wird PHP eine Fehlermeldung ausgeben, die wie folgt aussehen kann.
Parse error: parse error, unexpected T_FUNCTION, expecting ',' or ';' in
datei on line 2
Alles andere ist für ihn unexpected, also unerwartet. Hier ist z.B. das "function" unerwartet. Er wollte, in diesem Fall, ein , oder ; haben. Natürlich hätte er auch ein String oder eine Variable erwartet, doch er kann schlecht alle Token hinschreiben die er an dieser Stelle erwarten würde. Man will ja wissen, was er nicht haben wollte, bzw. wo der Fehler ist.
2. Fehler finden
Wenn PHP ein Script parsed, kann es natürlich zu Fehlern kommen. Meistens ist aber nicht klar wo genau der Fehler ist. Deswegen sollte man seinen Code richtig einrücken. Wie man das macht wird im Kapitel Einrücken durchgenommen. Wenn ihr hier feststellt, dass ihr mit den geschweiften Klammern nicht wieder zum anfang kommt, kann es sein, dass ihr irgentwo eine geschweifte Klammer vergessen habt.
Hier ist nun ein Beispielscript mit einem Fehler drin.
<?php
echo("hallo")
echo("du da");
?>
Hier wurde in Zeile 2 das Semikolon vergessen. Doch PHP liefert diese Fehlermeldung.
Parse error: parse error, unexpected T_ECHO, expecting ',' or ';' in _datei_ on line 3
Doch wie wir sehen, ist der Fehler in Zeile 2. Warum sagt er dann Zeile 3? PHP ignoriert ja Leerzeichen und Zeilenumbrüche beim Parsen. Nehmen wir an er ist mit dem Parse bis zum ende der 2. Zeile gekommen. Nun, was kann nun alles kommen. Er meint in der Fehlermeldung das ein Komma oder Semikolon erwartet wird (expecting ',' or ';') doch für ihn kommt ganz unerwartet der Token T_ECHO, was für echo steht. Da der Fehler genau an dieser Stelle auftrat, in Zeile 3, sagt er auch, dass in Zeile 3 unerwartet ein echo kam.
In 90% der Fälle liegt der Fehler genau eine Zeile dadrüber. Wenn ihr eine Fehlermeldung bekommt, prüft immer auch die Zeile über der Fehlerzeile nach.
In den anderen 10% sind die Fehler auch wirklich in dieser Zeile, oder aber auch ganz woanders. Ein Beispiel
<?php
if(false))
echo("fo");
echo("f");
?>
Hier ist eine Klammer zuviel, und das sagt auch PHP.
Parse error: parse error, unexpected ')' in _datei_ on line 2
Und hier stimmt auch wieder die Zeilenangabe. Aber es gibt auch eine Fall, wo die Zeilenangabe überhaupt nicht stimmt.
<?php
if($a == "foo)
{
mach_dies();
mach_das();
}
und_das();
?>
Hier wurde in Zeile 2 ein " vergessen. Mit einem richtigen Editor mit Syntaxhighlight sollte man diesen Fehler sofort sehen. PHP liefert aber folgende Fehlermeldung.
Parse error: parse error, unexpected $ in _datei_ on line 9
Denn PHP dachte hier, dass das alles zum String gehört. Nur als dann nix mehr kommt, auch nicht das schließende ", wird PHP stutzig und gibt eine Fehlermeldung aus. Was PHP mit dem unexcepted $ meint, weiß ich nicht.
Das sind so ein Paar fälle, auf die man aufpassen muss. PHP zeigt nicht immer die Fehlerzeile als Fehlerquelle an, sondern nur die Zeile, wo er ins Stecken gekommen ist. Eine Liste von ein paar bekannten Fehlermeldungen findet man in der php-FAQ unter dem Menupunkt Fehlermeldungen .
Fragen zum aktuellen Thema
- Was macht PHP beim abarbeiten?
-
PHP wandelt intern das Script in sogenannte Tokens um. Dann guckt er nach, ob die Token in der richtigen Reihenfolge sind, ob also dieses Token nach jenem Token folgen darf oder nicht, unabhängig ob es einen Sinn macht. Dies macht PHP mehr oder weniger parallel. eine Liste der Tokens findet man im PHP-Manual unter Anhang J. List of Parser Tokens .