Code-Snipplet: Statische Variablen sinnvoll einsetzen

Statische Variablen sind im Prinzip eine Mischung aus globalen und lokalen Variablen. Sie sind nur innerhalb der Funktion sichtbar, die sie deklariert hat, behalten jedoch nach verlassen der Funktion ihren Wert.

Schreibt man sich nun eine Funktion, die je nach Parametrisierung diese statische Variable setzt oder zurückgibt, kann man sich mit relativ wenig code beispielsweise eine gekapselte Registry schreiben, die nur über die entsprechende Funktion ansprechbar ist.

/**
 *
 * @staticvar array $opts
 * @param string $name
 * @param mixed $value
 * @return mixed
 */
function opt($name=null, $value=null)
{
    static $opts = array();
    if (is_null($name)) return $opts;
    if (!is_null($value))
    {
        $opts[$name] = $value;
    }
    return $opts[$name];
}

Beispiel:

// den Datei-Pfad als 'app dir' setzen
opt('app dir', dirname(__FILE__));

// Den Datei-Pfad von 'app dir' abrufen
echo opt('app dir');

Klar, könnte man auch mit define() lösen, allerdings lässt sich eine Konstante, wie der Name schon sagt, zur Laufzeit nicht mehr ändern.

Denkbar wäre auch die Umsetzung der singleton und factory pattern ohne dabei die entsprechende(n) Klassen modifizieren zu müssen.

/**
 * Erzeugt genau eine Instanz von 
 * $classname und gibt diese zurück.
 *
 * @staticvar array $classes
 * @param string $classname
 * @param array $args
 * @return instanceof $classname 
 */
function singleton($classname, $args=null)
{
    static $classes = array();

    if (!isset($classes[$classname]))
    {
        $classes[$classname] = factory($classname, $args);
    }
    return $classes[$classname];
}


/**
 * Erzeugt eine neue Instanz von 
 * $classname und gibt diese zurück. 
 * 
 * @param string $classname
 * @param array $args
 * @return instanceof $classname 
 */
function factory($classname, $args=null)
{
    $reflectionObject = new ReflectionClass($classname);
    return $reflectionObject->newInstance($args);
}

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.