Obiektowy mechanizm sesji

Mechanizm sesji jest jedną z podstawowych form „komunikacji” pomiędzy skryptami – jako jedyna tablica z super globalnych nie jest widoczna dla użytkownika. Mimo, że PHP od wersji 4 staje się coraz bardziej obiektowe mechanizm sesji ma nadal strukturę funkcyjną. Jednak, nic nie stoi na przeszkodzie by samemu stworzyć w pełni obiektową obsługę sesji…

Ale po co?

Mechanizm sesji napisany obiektowo pozwala na wygodniejsze zarządzanie zmiennymi sesyjnymi. Ponadto, możemy wzbogacić mechanizm o dodatkowe możliwości (np. możemy stworzyć przestrzenie nazw ułatwiające zarządzanie zmiennymi sesyjnymi). Co więcej, nic nie stoi na przeszkodzie by stworzyć własny mechanizm oparty np. na bazie danych. Dzięki wykorzystaniu obiektowości można w łatwy sposób zmienić sposób funkcjonowania sesji już w istniejącej aplikacji.

Implementacja

<?php
/**
 * @author Łukasz Socha <kontakt@lukasz-socha.pl>
 * @version: 1.0
 * @license http://www.gnu.org/copyleft/lesser.html
 */

/**
 * This class includes methods for session operation.
 *
 * @package Core
 */
class Session {

    /**
     * It starts the session.
     *
     * @return void
     */
    public static function start() {
        session_start();
    }
    /**
     * It sets the value to the session.
     *
     * @param string $name
     * @param string $value
     * @param string $namespace
     * @return void
     */
    public static function set($name, $value, $namespace='default') {
        self::start();
        $_SESSION[$namespace][$name]=$value;
    }
    /**
     * It checks if variable is seted in the session.
     *
     * @param string $name
     * @param string $namespace
     * @return bool
     */
    public static function is($name, $namespace='default') {
        self::start();
        return isset($_SESSION[$namespace][$name]);
    }
    /**
     * It gets the value from the session.
     *
     * @param string $name
     * @param string $namespace
     * @return mixed
     */
    public static function get($name, $namespace='default') {
        self::start();
        return $_SESSION[$namespace][$name];
    }
    /**
     * It gets and clears the value from the session.
     *
     * @param string $name
     * @param string $namespace
     * @return mixed
     */
    public static function getOnce($name, $namespace='default') {
        self::start();
        $var=$_SESSION[$namespace][$name];
        self::clear($name, $namespace);
        return $var;
    }
    /**
     * It clears the var of the session
     *
     * @param string $name
     * @param string $namespace
     * @return void
     */
    public static function clear($name, $namespace='default') {
        self::start();
        unset($_SESSION[$namespace][$name]);
    }
    /**
     * It clears the namespace of the session
     *
     * @param string $namespace
     * @return void
     */
    public static function clearNamespace($namespace='default') {
        self::start();
        unset($_SESSION[$namespace]);
    }
    /**
     * It clears all vars of the session
     *
     * @return void
     */
    public static function clearAll() {
        self::start();
        $_SESSION=array();
    }

    /**
     * It destroys the session.
     *
     * @return void
     */
    public static function destroy() {
        self::clearAll();
        session_destroy();
    }
    /**
     * It sets the session name.
     *
     * @param string $name
     * @return void
     */
    public static function name($name=null) {
        session_name($name);
    }
}
?>

Powyższy kod jest przykładową implementacją obiektowego mechanizmu sesji bazującego na wbudowanych funkcjach PHP. Dzięki wykorzystaniu statycznych metod nie musimy tworzyć instancji obiektów. Metody start() i destroy() służą do tworzenia i niszczenia sesji. Natomiast, za pomocą set() i get() ustawiamy i pobieramy wartości zmiennych. Ciekawym rozwiązaniem jest użycie namespaces zaproponowane we framework’u Zenda, które ułatwia uporządkowanie danych. Metody clearAll(), clearNamespace() i clear() służą do czyszczenia zmiennych.

Zakończenie

PHP z wersji na wersje staje się coraz bardziej obiektowe. Niestety jest jeszcze wiele elementów napisanych strukturalnie. Jednak, niektóre elementy, takie jak mechanizm sesji, warto przepisać wykorzystując programowanie obiektowe. Bazując na klasie Session można dowolnie rozbudowywać mechanizm.

Print Friendly, PDF & Email