Info zu dieser Vorschauseite

Rainer Schulz » 09. April 2011 um 03:20

Alle Inhalte der Vorschauseite im neuen Design dienen mir um zu sehen wie die einzelnen Bereiche mit Inhalt aussehen und wirken.

In Bereichen wo z.B. vorhandene Beiträge angezeigt werden, teste ich Funktionen/Methoden die ich für das Backend des Blogs schreibe.

Falls euch etwas nicht gefällt oder ihr Verbesserungsvorschläge habt, dann teilt mir das bitte über die Kommentarfunktion im Blog mit.

Knowledge is Power...

<?php
function getSince( $timestamp )
{
    if ( !is_numeric( $timestamp ) ) { return null; }

    $away = $_SERVER['REQUEST_TIME'] - $timestamp;

    if ( $away < 60 ) {
        $since = $away.' Sekunde'.( ( $away == 1 ) ? '' : 'n' );
    } elseif ( $away < 3600 ) {
        $tsp = floor( $away / 60 );
        $since = $tsp.' Minute'.( ( $tsp == 1 ) ? '' : 'n' );
    } elseif( $away < 86400 ) {
        $tsp = floor( $away / 3600 );
        $since = $tsp.' Stunde'.( ( $tsp == 1 ) ? '' : 'n' );
    } elseif( $away < 604800 ) {
        $tsp = floor( $away / 86400 );
        $since = $tsp.' Tag'.( ( $tsp == 1 ) ? '' : 'en' );
    } elseif( $away < 2592000 ) {
        $tsp = floor( $away / 604800 );
        $since = $tsp.' Woche'.( ( $tsp == 1 ) ? '' : 'n' );
    } elseif( $away < 31104000 ) {
        $tsp = floor( $away / 2592000 );
        $since = $tsp.' Monat'.( ( $tsp == 1 ) ? '' : 'en' );
    } elseif( $away < 155520000 ) {
        $tsp = floor( $away / 31104000 );
        $since = $tsp.' Jahr'.( ( $tsp == 1 ) ? '' : 'en' );
    } else {
        $since = 'Ewigkeiten';
    }

    return 'vor '.$since;
}
?>

PHP Design Patterns: Das Registry Pattern

02Jan20126

Rainer Schulz » vor 4 Jahren am 02. Januar 2012 um 14:53 » 5849 Klicks » 6 Kommentare

PHP 

Vorwort

Ich beschäftige mich schon seit einiger Zeit mit Design Patterns im Softwaredesign, vor allem mit der Umsetzung in PHP. Aus diesem Grund möchte ich euch heute das Registry Pattern beziehungsweise meine Registryklasse vorstellen.

Wozu eine Registryklasse?

Da meine Projekte, in der Regel, alle objektorientiert geschrieben sind, habe ich mir überlegt, wie ich eine Globalisierung von Variablen, Konstanten und Funktionen erreichen kann.

Die Registryklasse

In einem meiner Bücher, über Design Patterns, bin ich dann über ein Intermezzo mit genau diesem Thema gestoßen. Dieses Intermezzo hat mich dazu bewegt mir eine Registryklasse zu schreiben, welche dann nur noch in den anderen Klassen bekannt gemacht werden muss (beziehungsweise das Objekt der Klasse).

Eine kleine Info am Rande

Meine Registryklasse benutzt das Singleton Pattern welches nur eine einmalige Instanzierung der Klasse erlaubt.

Registryklasse:
/**
 * Registerklasse.
 *
 * @author Rainer Schulz <------@------->
 * @link http://raischblog.de/
 * @copyright 2011 - Rainer Schulz
 * @license CC BY-NC-SA 3.0 <http://creativecommons.org/licenses/by-nc-sa/3.0/>
 * @version 1.0 29/11/2011 18:41
 */
class RsRegistry
{
    // Klasseneigenschaften ====================================================

    private static $instance = null; // Speichert die Instanz der Klasse

    // Objekteigenschaften =====================================================

    /**
     * Array fuer die Variablen.
     * 
     * @access private
     */
    private $register = array();

    /**
     * Array zum Markieren von Konstanten.
     * 
     * @access private
     */
    private $readOnly = array();

    // Konstruktor und Destruktor ==============================================

    /**
     * Der Konstruktor.
     * 
     * @access private Instanzieren nur innerhalb dieser Klasse
     * @return object gibt ein neues Objekt der Klasse zurueck
     */
    private function __construct() {}

    /**
     * Der Destruktor.
     * 
     * @access public
     * @return void gibt nichts zurueck
     */
    public function __destruct() {}

    // Klassenmethoden =========================================================

    /**
     * Die getInstance-Methode des Singleton-Pattern.
     * Die Methode ist statisch (ohne Objekt aufrufbar).
     * Da der Konstruktor private ist, kann nur hier ein
     * Objekt der Klasse erstellt oder, wenn schon ein Objekt existiert,
     * geladen werden.
     * 
     * @access public
     * @return object gibt das Objekt der Klasse zurueck
     */
    public static function getInstance()
    {
        // wenn '$instance' noch auf 'null' steht
        if ( self::$instance === null ) {
            // wird einmalig ein Objekt dieser Klasse erzeugt
            self::$instance = new self();
        }

        // gibt das Objekt der Klasse zurueck
        return self::$instance;
    }

    // Objektmethoden ==========================================================

    /**
     * Methode zum setzen einer Konstanten.
     * 
     * @access public
     * @param string $key Name der Konstante
     * @param mixed $value Inhalt der Konstante
     * @return void gibt nichts zurueck
     */
    public function define( $key, $value )
    {
        if ( !$this->exists( $key ) ) {
            $this->register[$key] = $value;
            $this->readOnly[$key] = true;
            //return $this;
        } else {
            die(
                '<h1>Error: Constant \'<em>'.$key.'</em>\' is already created '.
                'in Registry!</h1>'
            );
        }
    }

    /**
     * 'Magische' Methode zum setzen einer Variable.
     * 
     * @access public
     * @param string $key Name der Variable
     * @param mixed $value Inhalt der Variable
     * @return void gibt nichts zurueck
     */
    public function __set( $key, $value )
    {
        if ( $this->isConstant( $key ) ) {
            die(
                '<h1>Error: Cannot override Constant \'<em>'.$key.
                '</em>\' in Registry!</h1>'
            );
        } else {
            $this->register[$key] = $value;
        }
    }

    /**
     * 'Magische' Methode zum holen einer Variable.
     * 
     * @access public
     * @param string $key Name der Variable
     * @return mixed gibt die Variable zurueck
     */
    public function __get( $key )
    {
        return $this->exists( $key ) ?
            $this->register[$key] :
            die(
                '<h1>Error: Key \'<em>'.$key.
                '</em>\' not found in Registry!</h1>'
            );
    }

    /**
     * 'Magische' Methode zum aufrufen einer Funktion.
     * 
     * Lambdafunktionen bzw anonyme Funktionen stehen ab PHP 5.3 zur Verfuegung.
     * 
     * @access public
     * @param string $key Name der Funktion
     * @param mixed $args Parameter der Funktion
     * @return function gibt die Funktion zurueck
     */
    public function __call( $key, $args )
    {
        if ( $this->exists( $key ) && is_callable( $this->register[$key] ) ) {
            return call_user_func_array( $this->register[$key], $args );
        }

        trigger_error( $key.' is not callable.', E_USER_ERROR );
    }

    /**
     * Methode entfernt eine gesetzte Variable.
     * 
     * @access public
     * @param string $key Name der zu entfernenden Variable
     * @return bool gibt einen Wahrheitswert zurueck
     */
    public function remove( $key )
    {
        if ( $this->isConstant( $key ) ) {
            die(
                '<h1>Error: Cannot remove Constant \'<em>'.$key.
                '</em>\' in Registry!</h1>'
            );
        } elseif ( $this->exists( $key ) ) {
            unset( $this->register[$key] );
            return true;
        }

        return false;
    }

    /**
     * Methode prueft, ob eine Variable/Konstante gesetzt ist.
     * 
     * @access public
     * @param string $key Name der zu pruefenden Variable/Konstante
     * @return bool gibt einen Wahrheitswert zurueck
     */
    public function exists( $key )
    {
        return array_key_exists( $key, $this->register );
    }

    /**
     * Methode prueft, ob $key eine Konstante ist.
     * 
     * @access public
     * @param string $key Name der zu pruefenden Variable/Konstante
     * @return bool gibt einen Wahrheitswert zurueck
     */
    public function isConstant( $key )
    {
        return array_key_exists( $key, $this->readOnly ) &&
               $this->readOnly[$key] === true ? true : false;
    }

    /**
     * Ueberschiebene Methode __clone() verhindert das Klonen des Objektes.
     * 
     * @access public
     */
    public function __clone()
    {
        trigger_error( 'Cloning of this object is not allowed.', E_USER_ERROR );
    }
}

Arbeiten mit der Registryklasse

Objekt erzeugen/holen

Ein Objekt der Klasse bekommt man nur über die getInstance()-Methode des Singleton Pattern.
$reg = RsRegistry::getInstance();

Variablen

Variablen speichern

Variablen können mit der magischen Methode __set(), wie folgt, gespeichert werden.
$reg->varName1 = 'String';
$reg->varName2 = 123;
$reg->varName3 = 1.23;
$reg->varName4 = array( 'eins' => 'one', 'zwei' => 'two' );
$reg->varName5 = $var;

Variablen holen

Variablen können mit der magischen Methode __get(), wie folgt, geholt werden.
$int = $reg->varName2;
echo $reg->varName1;
print_r( $reg->varName4 );

Variablen löschen

Variablen können mit der Methode remove(), wie folgt, gelöscht werden.
$reg->remove( 'varName3' );
$reg->remove( 'varName5' );

Konstanten

Konstanten speichern

Konstanten können mit der Methode define(), wie folgt, gespeichert werden.
$reg->define( 'BASE', 'http://raischblog.de' );
$reg->define( 'V2', 'http://v2.raischblog.de' );

Konstanten holen

Konstanten können mit der magischen Methode __get(), wie folgt, geholt werden.
$root = $reg->BASE;
echo $reg->V2;

Konstanten löschen

Konstanten können nicht gelöscht werden.

Funktionen

Funktionen speichern

Funktionen können mit der magischen Methode __set(), wie folgt, gespeichert werden.
$reg->getFullDateString = function ( $timestamp ) {
    return date( 'F d, Y - H:i', $timestamp );
}

Funktionen holen

Funktionen können mit der magischen Methode __call(), wie folgt, aufgerufen werden.
echo $reg->getFullDateString( time() );

Funktionen löschen

Funktionen können mit der Methode remove(), wie folgt, gelöscht werden.
$reg->remove( 'getFullDateString' );

Abschließendes

Bei Anregungen oder Fragen zur Klasse benutzt, wie immer, einfach die Kommentarfunktion.

 

Schlagwörter »            

Ausnahmebehandlung mit PHP

Rainer Schulz » 2753 Klicks 0 Kommentare
vor 4 Jahren am 01. Januar 2012 um 23:49

Vorwort - In den letzten Wochen habe wieder etwas mehr Zeit gefunden mich mit PHP zu beschäftigen. Daher werde ich in den nächsten Wochen ein paar von mir erstellte PHP-Klassen vorstellen. Welche das im Einzelnen sein werden, kann ich noch nicht sagen. In meinem heutigen Beitrag werde ich eine Exceptionhandlerklasse vorstellen. Die Exceptionhandlerklasse - Die Exceptionhandlerklasse ist dafür gedacht, unbehandelte Exceptions (Ausnahmen) abzufangen und ... weiterlesen

Alter eines Zeitstempels mit PHP ermitteln

Rainer Schulz » 4149 Klicks 9 Kommentare
vor Ewigkeiten am 04. Mai 2011 um 11:33

Vorwort - Ich schreibe schon einige Zeit das Backend für den Blog neu, dabei habe ich auch ein paar kleinere Funktionen geschrieben. Von diesen Funktionen möchte ich euch heute eine vorstellen von der ich denke, dass viele Webentwickler diese gebrauchen können. Die PHP Funktion - Die folgende Funktion benötigt einen UNIX-Zeitstempel, welcher in der Vergangenheit liegt, als Übergabeparameter. Der übergebene Zeitstempel wird mit dem aktuellen Zeitstempel ... weiterlesen

 

Optimierung des Blogs mit PHP

Rainer Schulz » 3657 Klicks 5 Kommentare
vor Ewigkeiten am 18. April 2011 um 15:33

Vorwort - Wie ich vor Kurzem berichtet habe, arbeite ich momentan an der zweiten Version dieses Blogs. Nicht nur das Design, sondern auch das komplette Backend des Blogs schreibe ich neu (in PHP). Im Zusammenhang damit habe ich mich ein wenig über Optimierungsmöglichkeiten informiert und möchte euch ein paar hier vorstellen. Autoload von Klassen in PHP - Wenn man, so wie ich, in seinem Webprojekt alles in Klassen schreibt (objektorientierte Programmierung), dann ... weiterlesen

Firefox 4 unter Ubuntu 10.10 installieren

Rainer Schulz » 3550 Klicks 5 Kommentare
vor Ewigkeiten am 11. April 2011 um 18:14

Installation bzw. Upgrade - Da ich einige Probleme hatte den Firefox 4 Download von Mozilla unter Ubuntu zu installieren, habe ich mich etwas informiert wie man es am besten anstellt. Und auf Ubuntuusers.de bin ich sehr schnell fündig geworden. Durch meine gescheiterten Versuche mit dem Download von Mozilla hatte ich erwartet, dass die Installation bzw. das Upgrade auf Firefox 4 ein steiniger Weg wird. Aber siehe da, am Ende war es dann doch sehr einfach. Es reicht die Eingabe ... weiterlesen

 

Raischblog Version 2 in Arbeit

Rainer Schulz » 4867 Klicks 16 Kommentare
vor Ewigkeiten am 04. April 2011 um 18:04

Design - Momentan arbeite ich an einer Neuauflage meines Blogs. Ich habe mich entschlossen, dass der Quelltext und vor allem die Optik meines Blogs aufbereitet werden müssen, hierzu zählt vor allem eine Neuerarbeitung des Stylesheets (css) welches hauptsächlich für das Aussehen des Blogs verantwortlich ist. Mir ist aufgefallen, dass mein derzeitiges Stylesheet doch eher suboptimal aufgebaut ist, dies möchte ich bei dem neuen Design vorzugsweise ... weiterlesen

Japan im Gedanken sind wir bei dir

Rainer Schulz » 1706 Klicks 2 Kommentare
vor Ewigkeiten am 14. März 2011 um 19:51

Als kleine Initiative der IT08 - Es regiert zurzeit sämtliche Medien, das Erdbeben in Japan und der darauf folgende Tsunami, es ist wohl das schlimmste Unglück Japans seit 65 Jahren. Aus diesem Anlass möchten wir drauf aufmerksam machen, dass der Internet-Konzern Google eine Personen-Suche in Japanisch und Englisch gestartet hat, wo unter anderem gespendet werden kann, aber auch eine Suche nach vermissten Personen ist möglich. Zu finden ist der Dienst von Google ... weiterlesen

 

LibreOffice unter Ubuntu 10.10 installieren

Rainer Schulz » 2493 Klicks 4 Kommentare
vor Ewigkeiten am 13. März 2011 um 19:05

Vorwort - Da die Installation von LibreOffice nicht so einfach zu sein scheint, habe ich nun schon ein paar Bekannten geholfen LibreOffice zu installieren. Das ist auch der Grund, warum ich hier ein kleinen Tutorial dafür schreibe. LibreOffice wird von der Firma "The Document Foundation" angeboten und ist der Nachfolger bzw. die Entwickler- und Communityweiterenwicklung von OpenOffice. LibreOffice liegt momentan in der Version 3.3.1 vor welche am 23. Februar 2011 ... weiterlesen

Die Textdatentypen in SQL

Rainer Schulz » 1596 Klicks 0 Kommentare
vor Ewigkeiten am 07. März 2011 um 21:47

Vorwort - Wie ich in meinem letzten Beitrag schon erwähnt habe, werden Textdatentypen als Zeichenketten in der Datenbank gespeichert. In Zeichenketten können Buchstaben, Zahlen, Sonder- und Steuerzeichen gespeichert werden. Zeichenketten kann man mit fester, variabler oder sehr großer Länge in eine Datenbank aufnehmen. Die Textdatentypen laut SQL-Standard - Der SQL-Standard kennt 3 Textdatentypen auf die ich hier eingehen möchte: CHARACTER ... weiterlesen

 

Datentypen in SQL

Rainer Schulz » 1579 Klicks 0 Kommentare
vor Ewigkeiten am 06. März 2011 um 23:54

Vorwort - Beim Erstellen und Arbeiten mit SQL-Datenbanken kommen wir nicht daran vorbei uns mit Datentypen zu beschäftigen. Deswegen möchte ich hier eine kleine Übersicht über die Datentypen, die in SQL Verwendung finden, geben. Wo werden uns Datentypen begegnen? - Prinzipiell werden uns Datentypen bei der Arbeit mit SQL häufig begegnen, dennoch brauchen wir die Datentypen nur an wenigen Stellen explizit angeben. Signifikant ist die Angabe von Datentypen ... weiterlesen

Einstieg in die Datenbankverwaltung mit SQL

Rainer Schulz » 1739 Klicks 0 Kommentare
vor Ewigkeiten am 02. März 2011 um 18:08

Vorwort - In der elektronischen Datenverarbeitung (EDV) der heutigen Zeit kann man sich Datenbanken und SQL (Structured Query Language) kaum noch weg denken. Vieles in unserem täglichen Leben behilft sich dieser Technologien und wäre ohne diese (fast) nicht mehr realisierbar. Die Konten- und Kundenverwaltung von Banken und Versicherungen kann man hier beispielshalber nennen. Im Internet trifft man an jeder Ecke Plattformen welche diese Technologien einsetzen. Nennen kann man ... weiterlesen