echo $begrüßung;
» $variable wird im Programm also immer den Wert von $_SESSION haben.
$variable kommt aus $_SESSION, wenn die Reihenfolge entsprechend eingestellt ist (EGPCS)
http://www.php.net/manual/en/ini.core.php#ini.register-globals, weil immer das letzte die vorigen überschreibt...
Das S steht hier aber für SERVER. Dass die Session die bereits vorhandenen Variablen überschreibt liegt daran, dass die Variablen aus EGPCS vor dem Scriptstart angelegt werden, die aus der Session aber erst mit session_start() hinzukommen.
» Ich vermute mal, das liegt an register_globals = on in der PHP.INI.
Dass register_globals angeschaltet ist, ist kein Grund, auf dieses Feature zu bauen. Zusammen mit schlechter Programmierung ist das Feature eine Sicherheitslücke und deshalb schon seit vielen Versionen per Default ausgeschaltet (nur einige Provider wollen sich Kundensupport ersparen - zum Preis von möglichen Sicherheitslücken) und wird mit PHP 6 ersatzlos gestrichen. Zusätzlich zum generellen Verwenden der $_*-Arrays ist anzuraten, penibel vor jedem Verwenden einer Variable, sie mit einem Default-Wert zu initialisieren. Das muss so programmiert sein, dass auch bei Verzweigungen stets eine Initialisierung erfolgt.
if (!Test)
$errors[] = "ein Fehler";
else
...
foreach ($errors as ...)
In diesem Beispiel gibt es $errors nicht, wenn der Test erfolgreich war. Das anschließende foreach greift im besten Fall ins Leere, im schlechten Fall auf irgendwas vorhandenes. Ein
$errors = array();
vor dem if sorgt für eine garantierte Existenz. Und auch wenn durch register_globals=on über welchen unerwünschten Weg auch immer $errors angelegt wurde, ist es mit der expliziten Initialisierung unschädlich gemacht worden.
echo "$verabschiedung $name";