PHP Portal » Tutorials » Design Pattern mit PHP » Singleton - immer nur eines!

Design Pattern mit PHP :: Singleton - immer nur eines!

Design Pattern mit PHP :: Singleton - immer nur eines!

Da nun Objekte beliebiger Klassen kontrolliert gebaut werden können, kann man sich aufmachen spezielle Anforderungen umzusetzen. In vielen Fällen es es notwendig, immer mit dem selben Objekt zu arbeiten. Bekannte Beispiele sind dafür Datenbankverbindungen oder auch Templatesysteme. Bei Datenbanken macht es wenig Sinn, für jede Abfrage eine neue Verbindung aufzubauen, es ist viel sinnvoller und auch schneller, die bereits bestehende Verbindung zu nutzen.

Im Folgenden wird eine Klasse Singleton vorgestellt, welche von außen dafür sorgt, dass immer nur eine Instanz eines Objektes existiert. Einzige Bedingung die hierbei nicht erfüllt wird ist, dass der Programmierer mit "new Klasse()" sich trotzdem noch ein 2. Objekt bauen kann. Bei der standardmäßigen Implementierung wird dies auch erfüllt.

PHP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Singleton { static private $objects = array(); /** * statische Methode zum implementieren des Singleton Pattern * Objekte, von welchen es nur eine Instanz geben darf/soll * * @param string $class_name - Paket::Klassenname des gewünschten Objektes * @param array $params - Parameter für den Konstruktor der Klasse * @return object vom Typ $class_name **/ static public function get( $class_name, $params = null ) { // ist $class_name überhaupt gültig if( ! is_string( $class_name ) || ! trim( $class_name ) ) { throw new Exception( 'kein gültiger Klassenname' ); } // wenn noch kein Objekt da ist, eins bauen if( ! isset( Singleton::$objects[$class_name] ) ) { // das Factory Pattern macht das für uns Singleton::$objects[$class_name] = & Factory::get( $class_name, $params ); } return Singleton::$objects[$class_name]; } } // Benutzung des Singleton Pattern // Pfad festlegen für die Klassen define( '_CLASS_PATH_', '/var/www/classes/' ); // Objekt bauen try { // bindet die Klasse "/var/www/class/meinpaket/meineklasse.class.php" ein $test1 = Singleton::get( 'MeinPaket::MeineKlasse' ); $test2 = Singleton::get( 'MeinPaket::MeineKlasse' ); var_dump( $test1 ); var_dump( $test2 ); }catch( Exception $e ) { echo $e->getMessage(); }

weiter »» «« zurück