phpBuddy

Tutorials und Workshops

Wie kann man Daten in eine Datenbank schreiben und wieder auslesen? Wie schützt man sein Gästebuch vor Spam? Wie erstellt man eine Bildergalerie?
Diese und mehr Fragen werden in der Tutorial Rubrik sehr detailliert und leicht verständlich erklärt.

Sie sind hier: Startseite Registry Klasse
Registry Klasse - Session Scope

Wenn man mit OOP zu hat, stolpert man früher oder später über das Registry-Pattern. Das Registry-Pattern ist ein Entwurfsmuster, dass einen Container für Informationen, also ein Ablageplatz für Daten, beschreibt. Normalerweise findet es seinen Einsatz beim programmieren mit Schichten, wie z.B. MVC oder HMVC.
Das Registry-Objekt nimmt also Daten auf die in den verschiedenen Schichten benötigt werden und stellt diese global zur Verfügung. Der Nachteil des Registry-Objekts ist, dass es per Request, also per Seitenaufruf, arbeitet. Wird das Script beendet, gehen auch die Daten im Objekt verloren. Manchmal benötigt man aber Request übergreifend Daten und dafür stellt uns PHP ja die Session zur Verfügung. Kombiniert man beides, das Registry-Objekt mit der Möglichkeit einer Session, Daten persistent zu speichern, landen wir beim Registry-Objekt Session Scope (Scope bedeutet hier Sichtbarkeitsbereich).

Ein Registry-Objekt wird davon gekennzeichnet, dass es global verfügbar ist und das es von der Registry-Klasse nur eine Instanz geben darf. Um beides zu gewährleisten, kommt das Singleton-Pattern zum Einsatz.
Nachfolgend der Code der Registry-Klasse mit Session Scope, mit einem einfachen Anwendungsbeispiel. Im Download befindet sich neben der Klasse auch ein ausführlicheres Anwendungsbeispiel. Die Klasse setzt PHP 5.2 oder höher voraus!

<?php
 
class Registry
{
   /**
    * @var object Instance of registry class
    */
    protected static $instance = NULL;
 
 
    /**
     * Get an instance of registry class
     *
     * @return object Instance of registry class
     */
    public static function getInstance()
    {
        if (self::$instance === NULL)
        {
            self::$instance = new self();
        }
        return self::$instance;
    }
 
 
    /**
     * Constructor - start session
     */
    protected function __construct()
    {
        session_start();
        if (isset( $_SESSION['_registry'] ) === FALSE)
        {
            $_SESSION['_registry'] = array();
        }
    }
 
 
    /**
     * Clone - prevent additional instances of the class
     */
    private function __clone() {}
 
 
    /**
     * Magic Method to set a registry variable
     *
     * @param  string  $key   Registry array key
     * @param  string  $value Value of registry key
     * @return mixed   TRUE on success otherwise FALSE
     */
    public function __set( $key, $value )
    {
        if (isset( $_SESSION['_registry'][$key] ) === FALSE)
        {
            $_SESSION['_registry'][$key] = $value;
            return TRUE;
        }
        return FALSE;
    }
 
 
    /**
     * Magic Method to get a registry variable
     *
     * @param  string  $key   Registry array key
     * @return bool    TRUE on success otherwise NULL
     */
    public function &__get( $key )
    {
        if (isset( $_SESSION['_registry'][$key] ))
        {
            return $_SESSION['_registry'][$key];
        }
        return NULL;
    }
 
 
    /**
     * Unset a registry variable
     *
     * @param  string  $key   Registry array key
     * @return bool    TRUE on success otherwise FALSE
     */
    public function __unset( $key )
    {
        if (isset( $_SESSION['_registry'][$key] ))
        {
            unset( $_SESSION['_registry'][$key] );
            return TRUE;
        }
        return FALSE;
    }
 
 
    /**
     * Reset registry
     *
     * @return bool    TRUE
     */
    public function reset()
    {
        $_SESSION['_registry'] = array();
        return FALSE;
    }
}
 
?>

Hier ein kleines Anwendungsbeispiel:

<?php
 
error_reporting( 0 );
 
function __autoload( $class )
{
    $classname = strtolower( $class );
    include_once( $classname . '.php' );
}
 
// Instanz
$registry = Registry::getInstance();
 
// Sub-Array Benutzer
$registry->benutzer = array();
$registry->benutzer['vorname']  = 'Max';
$registry->benutzer['nachname'] = 'Mustermann';
$registry->benutzer['beruf']    = 'Maler';
$registry->benutzer['wohnort']  = 'Musterstadt';
 
// Sub-Array Config
$registry->dbconfig = array();
$registry->dbconfig['host']     = 'localhost';
$registry->dbconfig['benutzer'] = 'root';
$registry->dbconfig['passwort'] = 'geheim';
$registry->dbconfig['port']     = 3306;
 
// Normaler Vars
$registry->vorname  = 'Susi';
$registry->nachname = 'Sauer';
 
// Ausgabe SESSION
echo "<pre>" . print_r( $_SESSION, TRUE ) . "</pre>";
 
?>

Die Ausgabe zu diesem Script:

Array
(
    [_registry] => Array
        (
            [benutzer] => Array
                (
                    [vorname] => Max
                    [nachname] => Mustermann
                    [beruf] => Maler
                    [wohnort] => Musterstadt
                )
 
            [dbconfig] => Array
                (
                    [host] => localhost
                    [benutzer] => root
                    [passwort] => geheim
                    [port] => 3306
                )
 
            [nachname] => Sauer
            [wohnort] => Rosenheim
            [beruf] => Designerin
            [vorname] => Susi
        )
)
 

Wie man sieht, gibt es im Array _registry noch weitere Arrays für benutzer und dbconfig, sowie einige lose Variablen. So wie man hier Informationen für z.B. benutzer zusammenfassen kann, so könnte man dort auch weitere Objekte von anderen Klassen darin ablegen. Um die Registry systemweit zu verwenden, lädt man einfach mit...

$registry = Registry::getInstance();

...eine Instanz der Registry Klasse und hat sofort Zugriff auf alle darin abgelegte Informationen.
Auf diese Weise kann man Daten, die persistent verfügbar gemacht werden sollen, hübsch gekapselt aufbewahren und hat globalen Zugriff darauf.

Registry Klasse (3 KB)