Registrieren von Session-Variablen in Funktionen

in PHP Tutorials

Ein einfaches Registrieren von Session-Variablen innerhalb von Funktionen wird wahrscheinlich nicht zum gewünschten Erfolg führen, da sich in PHP – im Gegensatz zu den meisten Hochsprachen – die Sichtbarkeit von Variablen (Scope) lokal auf die Funktionen beschränkt. Das bedeutet, dass die innerhalb von Funktionen oder Klassen-Methoden gesetzten Variablenwerte wieder verworfen werden, nachdem die Funktion abgearbeitet worden ist. Man spricht hier auch vom sog. lokalen und globalen Namensraum oder auch vom lokalen und globalen Scope.

Da wir mittlerweile wissen, dass die Werte von registrierten Sessionvariablen erst am Ende des Scriptes gespeichert werden, können wir davon ausgehen, dass der Versuch eine Sessionvariable innerhalb einer Funktion zu registrieren nur zu einem Teilerfolg führen wird. Der Variablename wird in den Session-Daten gespeichert (registriert), aber der Wert der Variable wird der letzte Wert im globalen Scope sein: u.U. leer oder falsch. Wahrscheinlich wurde das innerhalb einer Funktion nicht beabsichtigt.


Möchte man dennoch Variablenwerte aus Funktionen heraus registrieren, so muss man die Werte – unsaubererweise – in den globalen Scope überführen:

Datei: sess.howto5.php

<?php
  @session_start();
  $s_foo = 'one'; 

  function doRegister() {
    session_register('s_foo');     
    $GLOBALS['s_foo'] = 'another';
  } 

  doRegister();
?>

Dieses Script registriert die Variable $s_foo mit ihrem Wert (”another”) in der Session. Wie man es sich leicht vorstellen kann, können solche Konstrukte ins Auge gehen, wenn sich Variablen mit gleichen Namen im globalem Scope befinden: in diesem Fall wird der Wert “one” der Variable $s_foo überschreiben.


Es ist sinnvoller auf die Registrierung von Variablen innerhalb von Funktionen und/oder Klassen-Mathoden zu verzichten, und dies im Haupt-Script (im globalen Scope) zu erledigen. Dazu muss die Funktion die Werte an den diesen Namensraum zurückgeben:

Datei: sess.howto6.php

<?php
  @session_start(); 

  function doSomething($x) {
    $y = $x * $x;
    return $y;
  }

  session_register('s_result');
  $s_result = doSomething(42);
?>

Kommt man in die Verlegenheit mehrere Werte zurückgeben zu müssen, so nutzt man ein Array als Rückgabeparameter und registriert dieses ganz:

Datei: sess.howto7.php

<?php
  @session_start(); 

  function doSomething($x) {
    $y = $x * $x;
    $z = dechex($y);   

    return array('y' => $y, 'z' => $z);
  } 

  session_register('s_result');
  $s_result = doSomething(42);
?>

Möchte man nur einzelne Elemente dieses Arrays registrieren, so müssen diese wieder einzeln im globalen Scope deklariert werden:

Datei: sess.howto8.php

<?php
  @session_start(); 

  function doSomething($x) {
    $y = $x * $x;
    $z = dechex($y);

    return array('y' => $y, 'z' => $z);
  }

  session_register('s_y', 's_z');

  $s_result = doSomething(42);

  $s_y = $s_result['y'];
  $s_z = $s_result['z'];
?>

Leave a Comment

Seite zurück: Löschen verwaister Sessiondateien

Seite vor: Typische Fehlerquellen beim Umgang mit PHP-Sessions