Moin!
hmmm es liegt also tatsächlich an dem abschliessenden ?>
Nein, es liegt an dem Leerzeichen dahinter. Das ist die Ursache für dein Problem.
Nochmal zur Klarstellung der Codeablauf:
index.php:
require_once(test.php); <- Programmablauf wird in dieser Datei unterbrochen, eine neue Datei wird ausgeführt.
test.php:
function test()... <- Definition einer Funktion - kommt in den Speicher, tut nix.
echo " "; <- Ausgabe des Leerzeichens, weil es hinter dem ?> im HTML-Bereich steht.
EOF <- Dateiende, zurück zur Index.php
index.php
test(); <- Funktionsaufruf. Der ruft die im Speicher befindliche Funktionsdefinition auf. Was NICHT passiert ist, dass der Funktionsaufruf in irgendeiner Weise nochmal mit der Datei "test.php" verknüpft wird.
header(); <- scheitert wegen der vorhergehenden Ausgabe des Leerzeichens.
Denn ohne den könnten auch noch tausende Leerzeichen drin sein und keine Probleme bereiten.
Richtig, weil Leerzeichen im PHP-Teil kein ausführbarer Code sind und auch zu keiner Ausgabe führen.
Also ich weiss nicht, ich würde sowas BUG nennen. Keine Programmiersprache kann doch allen Ernstes empfehlen einen einleitenen Tag zu machen und den abschliesssenden auf keinen Fall.
Stimmt so ja auch nicht. Es wird empfohlen, in "reinen PHP-Dateien", die keinerlei HTML-Teil enthalten, das einzige schließende PHP-Tag am Dateiende wegzulassen, um möglichen Problemen mit noch danach folgendem Whitespace (auch Zeilenumbrüche etc. verursachen das Problem) schon direkt aus dem Weg zu gehen.
Es ist eine Empfehlung, keine Vorschrift - jeder Coding-Standard ist nur eine Empfehlung, wenn man sich dran halten will, darf man das tun, wenn nicht, bricht auch keine Welt zusammen. Wenn man weiß, warum die Empfehlung gegeben wurde, und deren Ursache sicher im Griff hat, so dass sie nicht auftreten kann, dann spricht nichts dagegen, sie zu ignorieren.
- Sven Rautenberg