singleton und destruct

TheGreenDragon

Erfahrenes Mitglied
Hallo,

ich möchte eine SAP-Verbindung über ein Singleton realisieren. Jedoch möchte ich die Verbindung nicht explizit trennen, da im laufe des Skriptausführung die Verbindung noch öfters gebraucht wird. Jedoch sollte sie am Ende der Skriptausführung selbständig getrennt werden. Wie mache ich das nun? Bei Objekten könnte ich in der __destruct() Methode die Verbindung trennen. Dann würde ich aber zu viele Objekte und somit Verbindungen erstellen.
Ich steh grad irgendwie auf dem Schlauch...
 
Ich weiß jetzt nicht, ob ich dich richtig verstanden habe, aber so in etwa könnte man es realisieren:
PHP:
<?php
class MySAPConnector 
{
	public static function &getInstance()
	{
		static $instance = null;
		if($instance === null)
			$instance = new self();
		
		return $instance;
	}

	// Kein public Zugriff, kann nur über getInstance() aufgerufen werden
	private function __construct()
	{
		// hier die Verbindung aufbauen
		echo 'Conencted to SAP<br />';
	}
	
	// public, damit der Destruktor am Ende des Skripts abgebaut wird
	public function __destruct()
	{
		// hier die Verbindung abbauen
		echo 'Disconnected from SAP<br />';
	}
	
	// hier noch die restlichen funktionen, die du brauchst
	public function doSomething()
	{
		echo 'did something<br />';
	}
}

// erster Zugriff auf SAP im gesamten Durchlauf, hier wird der 
// Konstruktor durch getInstance() aufgerufen
$sapConnection = &MySAPConnector::getInstance();
$sapConnection->doSomething();

// zweiter Zugriff, wieder mittels getInstance(), allerdings 
// wird der Konstruktor nicht aufgerufen, da dies im Durchlauf schon geschehen ist
$sapConnection = &MySAPConnector::getInstance();
$sapConnection->doSomething();
?>

Es gäbe auch noch ein alternativer Aufbau, der das IF in getInstance() erspart. Hierbei muss der Konstruktor einmal explizit aufgerufen werden:
PHP:
<?php
class MySAPConnector 
{
	static $instance;
	public static function &getInstance()
	{
		return self::$instance;
	}

	// Kein public Zugriff, kann nur über getInstance() aufgerufen werden
	public function __construct()
	{
		// hier die Verbindung aufbauen
		echo 'Conencted to SAP<br />';
		
		// Object in $instance vermerken
		self::$instance = $this;
	}
	
	// rest ist identisch
}

// muss explizit einmal aufgerufen werden, um das Objekt zu erstellen
new MySAPConnector();

// erster Zugriff auf SAP im gesamten Durchlauf, hier wird der 
// Kdas Object genommen, welches beim Aufruf des Konstruktors
// in $instance hinterlegt wurde
$sapConnection = &MySAPConnector::getInstance();

// rest ist identisch
?>
 
Zuletzt bearbeitet:
Hab mal den Singleton-Pattern von Wikipedia genommen und um ein public __destruct() erweitert. Das funktioniert

PHP:
 <?php
 final class Singleton {
 
   // Anlegen der Instanz
   private static $instance = NULL;
 
   // Konstruktor private, damit die Klasse nur aus sich selbst heraus instanziiert werden kann.
   private function __construct() {}
   
   public function __destruct() {
       echo 'Singleton::__destruct()';
   }
 
   // Diese statische Methode gibt die Instanz zurueck.
   public static function getInstance() {
 
       if (self::$instance === NULL) {
           self::$instance = new self;
       }
       return self::$instance;
   }
   // Klonen per 'clone()' von außen verbieten.
   private function __clone() {}
 }
 
 $singleton = Singleton::getInstance();
 
 ?>
 
Blah und text
<br />

Ausgabe
Code:
Blah und text
Singleton::__destruct()
 
Danke euch beiden, ja ich stand irgendwie auf dem Schlau. Hab mich dauernd gefragt wann destruct nun aufgerufen wird, wenn ich doch mit Klassenvariablen hantiere in denen dann meine eigentliche Verbindung hinterlegt ist und dabei gar nicht mehr daran gedacht das von dem Singleton ja mindestens ein Objekt erstellt wird wo dann auch der Destructor aufgerufen wird. So dass eben auch die Verbindung die dann in der Klassenvariable hinterlegt ist wieder vernünftig ohne mein zutun geschlossen wird. Sorry und Danke nochmals :-)
 
Zurück