Mailinglisten-Archive |
On Sunday 02 January 2005 12:00, Norbert Pfeiffer wrote:
> Frueher, als hier noch aktive PHP-Entwickler auf
ich weiß das hier noch PHP-Entwickler Abonnenten sind auch wenn sie nicht
alles mitlesen und erst recht nicht ständig was posten ...
Aber zum eigentlichen Problem:
Das Problem, wie hier ja schon des öfteren stand sind die short_open_tags
"<?". Die bringen den Parser dazu vom INITIAL in den ST_IN_SCRIPTING Modus
zuschalten und somit den Code als PHP zu parsen. Dadurch reicht es im Skripts
<? do_something(); ?> statt <?php do_something(); ?> zu schreiben. Folglich
interpretiert er bei der Eingabe
<?xml version="1.0" ?>
den Teil
xml version="1.0"
als PHP Code was natürlich kein PHP Code ist. Jetzt kann man dem Parser
beibringen (was auch nicht sonderlich schwer ist), dass <?xml anders
behandelt werden soll. Dies löst das Problem aber nicht. Entsprechend der
XML-Spezifikation kommt in einer processing instruction, mit solch einer
haben wir es bei XML mit dem <? ... ?> Zeug zu tun, nach dem initialen <? das
Ziel der selben, wobei selbiges nicht weiter spezifiziert ist sondern vom XML
Parser verarbeitet wird. Folglich kann man da beliebige Ziele definieren. Ein
bekanntes Beispiel neben <?xml .. ?> ist z.B. <?xsl ?> aber auch <?php ?> ist
zunächstmal nichts anderes. Jetzt könnte man den Parser so umschreiben, dass
er nach einem <? schaut ob danach PHP-Code oder eine Processing Intstruction
kommt aber auch das bringt nichts, da solch wunderbare Dinge wie
<?echo 13435; ?>
100%ig gültig in PHP wäre aber ebenso mit XML (auch wenn ich mir keinen
Anwendungsfall vorstellen kann, aber sag niemals nie), dafür hätte man einen
deutlich komplexeren Parser und immernoch eine unklare Situation. Aus
Entwickler-Sichte gäbe es nur eine mögliche Option um das zu umgehen:
short_open_tag auf Off schalten - das würde aber bei ebensoviele Skripts zu
Problemen führen wie bei register_globals - wobei hier mit einem einfachen
Suchen&Ersetzen weit mehr gefixt werden kann.
Aus Anwender-Sicht bleibt somit nur die Möglichkeit die PI per echo
auszugeben, was auch nicht so umständlich ist, da man ja in aller Regel eh
einen entsprechenden Content-type-Header voraus schicken will:
<?php
header('Content-type: text/xml');
echo '<?xml version="1.0" ?>';
?>
in der Hoffnung das verständlich erklärt zu haben,
johannes
php::bar PHP Wiki - Listenarchive