Probleme mit Sigleton in PHP4
MM
- php
Hallo zusammen,
ich habe folgendes Problem: Ich brauche ein Sigleton und habe nur PHP4 (nicht 5) zur Verfügung. Mein Ansatz ist folgender:
class FormFieldManager {
var $types = array();
function getInstance() {
static $instance;
echo("getInstance<br>");
if (!isset($instance)) {
echo("Neue Instanz<br>");
$instance = new FormFieldManager();
}
return $instance;
}
function registerFieldType($inFieldType) {
array_push($this->types, $inFieldType);
}
function getTypes() {
return $this->types;
}
}
$a = FormFieldManager::getInstance();
$b = FormFieldManager::getInstance();
$a->registerFieldType("bla");
echo (sizeof($a->getTypes()). "\t" . sizeof($b->getTypes())."<br>");
$b->registerFieldType("blub");
echo (sizeof($a->getTypes()). "\t" . sizeof($b->getTypes()));
Der Aufruf liefert folgende Ausgabe:
getInstance
Neue Instanz
getInstance
1 0
1 1
Man sieht also, dass die getInstance-Methode schon ganz gut funktioniert. Es wird wie gewünscht nur beim ersten Aufruf eine Instanz erzeugt. So weit; so gut.
Somit sollten $a und $b identisch sein, oder?
Nun füge ich bei $a mit registerFieldType() etwas hinzu und lasse mir die Größe der types-Arrays ausgeben. Und siehe da: $a und $b unterscheiden sich. Warum???
Was mache ich falsch?
Vielen Dank im Vorraus!
Hallo MM.
$a = FormFieldManager::getInstance();
$b = FormFieldManager::getInstance();$a->registerFieldType("bla");
echo (sizeof($a->getTypes()). "\t" . sizeof($b->getTypes())."<br>");$b->registerFieldType("blub");
echo (sizeof($a->getTypes()). "\t" . sizeof($b->getTypes()));Der Aufruf liefert folgende Ausgabe:
getInstance
Neue Instanz
getInstance
1 0
1 1[…]
Nun füge ich bei $a mit registerFieldType() etwas hinzu und lasse mir die Größe der types-Arrays ausgeben. Und siehe da: $a und $b unterscheiden sich. Warum???
Weil du zum Zeitpunkt dieser Ausgabe noch nicht FormFieldManager::registerFieldType für $b aufgerufen hast? Dem entsprechend ist der Array FormFieldManager::$types natürlich auch noch leer, weshalb der erste Größenvergleich unterschiedliche Werte liefert. In der Folgezeile unterscheiden sich die beiden Ausgaben nach dem Ausführen genannter Methode jedoch nicht mehr.
Einen schönen Montag noch.
Gruß, Mathias
echo $begrüßung;
function getInstance() {
static $instance;
if (!isset($instance)) {
$instance = new FormFieldManager();
}
return $instance;
}
Was mache ich falsch?
PHP4 arbeitet bei der Übergabe von Objekten mit Kopien. PHP5 hingegen verwendet bei Objekten (aber nur bei diesen) Referenzen. Deine Funktion gibt jedes Mal eine Kopie der erzeugten Instanz zurück. Alle Kopien sind natürlich eigenständig was die Inhalte ihrer Eigenschaften angeht. Du hast also kein Singleton sondern eher ein Factory erstellt. Du musst eine Referenz zurückgeben.
echo "$verabschiedung $name";