• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[PHP] Singleton für Kindklasse

S

slosd

Guest
Hi, hab hier ja schon ewig nix mehr gepostet ^^

Naja, jedenfalls wollte ich gerade eine Klasse implementieren, die (unter anderem) ein Singleton Muster realisiert:
PHP:
abstract class A {
  private static $instance;
  final private function __construct() {}
  final public static function load() {
    if(self::$instance == null) {
      self::$instance = new self();
    }
    return self::$instance;
  }
}

class B extends A {}

$b_object = B::load();
Das self in der Funktion load zeigt hier leider auf die Klasse A. Ab PHP 5.3 gibts die Funktion get_called_class welche den Namen der aufgerufenen Klasse zurückgibt. Die Version steht mir leider nicht zur Verfügung wo das Skript laufen soll.
Gibt es also eine andere Möglichkeit das Singletonverhalten vererbar zu machen?

Danke schon mal.
 
Zuletzt bearbeitet von einem Moderator:
das scheitert wahrscheinlich an private static $instance;. du könntest natürlich auch ein Interface/abstrakte Klasse schreiben, was die Klasse zum Singleton zwingt.

kannst du überhaupt B::load() aufrufen, wenn es in A final ist?
 
Zuletzt bearbeitet:
das scheitert wahrscheinlich an private static $instance;. du könntest natürlich auch ein Interface/abstrakte Klasse schreiben, was die Klasse zum Singleton zwingt.
Naja damit definier ich halt auch nur die Schnittstellen... was dann in den Funktionen passiert kann ich so nicht begrenzen. Außerdem würds mir drum gehen dass ich die Kindklassen etwas sauberer halten kann und nicht in jeder einzelnen das Singleton implementieren muss...

kannst du überhaupt B::load() aufrufen, wenn es in A final ist?
Ja das is kein Problem. Ich erhalte diesen Fehler, weil ich mit new self() ein neues Objekt für die abstrakte Klasse A erstellen will:
Fatal error: Cannot instantiate abstract class A in /var/www/test/engine/main.php on line 317
 
Zuletzt bearbeitet von einem Moderator:
Das ist ein riesen Nachteil in PHP - in statischen, vererbten Funktionen wird self nicht angepasst und ist immer die Klasse in dem die Funktion definiert ist.
Ich habe auch noch keine saubere statische Lösung für diese Problem gefunden (debug_backtrace enthält falsche Informationen) - um das entsprechende Verhalten zu simulieren hab' ich meistens auf static verzichtet... ist eigentlich nicht Sinn der Sache - aber was soll man machen.

PS: http://de3.php.net/manual/pl/language.oop5.late-static-bindings.php
 
Zurück
Oben