Autoload und Single,- bzw. Factory

bofh1337

Erfahrenes Mitglied
Nun ist es soweit, jetzt bricht ein schwarzer Moment in meinem Leben an: Ich weiss im PHP nicht weiter :/

Ich bin gerade dabei, ein kleines MVC-Framework zu bauen, um darauf verschiedene Scripte aufzubauen.
Damit ich nicht überall im Scripte eine Require und/oder Include-Orgie starten muss, will ich benötigte Klassen über die "__autoload()"-Methode innerhalb der Base-Klasse laden, dort scheint es aber ein technisches Problem zu geben, da Singleton-Klassen ja anders geladen werden müssen, wie Factory-Klassen.
Das ganze befindet sich noch im "Rohbau", dort sind noch keinerlei Variablen geprüft oder escapt,- bzw. gegen PHP-Injection geschützt, das ganze ist auch noch nicht getestet, sondern ein Entwurfsmuster.
Sinn und Zweck der ganzen Klamotte ist, das Instancen von Nachgeladenen Klasse auch als Object mit dem jeweiligen Klassennamen innerhalb der Base-Instance verfügbar sein sollen, damit ich nach 6-12 Monaten innerhalb meines eigenen Code`s noch durchblicke,- so sollte es also dann innerhalb des Codes aussehen:

$base = &base::getInstance();
$base->klassenname1->methodeA();
$base->klassenname2->methodeA();

So sieht die Methode bis jetzt aus, eventuell hat einer von euch sowas schon mal gemacht und kann mir da weiterhelfen ;)

__WISO_DIR_CLASSES__ ist dabei eine Konstante mit den Pfaden innerhalb des Scriptes, in diesem Fall der Pfad zum Verzeichnis, wo die ganzen System-Klassen liegen


PHP:
	protected function __autoload($classdata)
	{
		if (file_exists(__WISO_DIR_CLASSES__ . '/wiso.class.' . $classdata . '.php'))
		{
			require (__WISO_DIR_CLASSES__ . '/wiso.class.' . $classdata . '.php');
		}
		else
		{
			die ('Class: ' . $classdata . ' konnte nicht per __autoload(); geladen werden!');
		}
		if (method_exists($classdata, 'getInstance'))
		{
			$this->$classdata = $classdata->getInstance();
		}
		else
		{
			$this->$classdata = new $classdata;
		}
	}

Probleme sehe ich in der Zeile:

PHP:
$this->$classdata = $classdata->getInstance();

Diese müsste eigentlich so aussehen:

PHP:
$this->$classdata = $classdata::getInstance();

aber dummerweise bedeutet das einen Parse-Error.
 
Mmmh, wenn du so reichhaltig mit Infos herüberkommen magst, kannst du dann wenigstens Einblick in die Klasse gewähren, welche dieses __autoload() dort als Methode hat(ist mir bisher noch nicht begegnet, __autoload() als Klassenmethode zu verwenden, aber man lernt ja nie aus).
 
Mmmh, wenn du so reichhaltig mit Infos herüberkommen magst, kannst du dann wenigstens Einblick in die Klasse gewähren, welche dieses __autoload() dort als Methode hat(ist mir bisher noch nicht begegnet, __autoload() als Klassenmethode zu verwenden, aber man lernt ja nie aus).

Die Klassen, die da automatisch geladen werden sollen, sind Klassen nach gerwöhnliche Singleton bzw. Factory-Pattern, die Klasse, wo die __autoload enthalten ist (Base-Klasse) ist ja nicht mal ansatzweise fertig
 
Wie lautet denn der PHP Fehler genau? Ich hatte z.B. einen PHP Fehler bekommen, weil ich vergessen hatte, die getInstance() als static zu definieren.

Das mit dem Pfeil ist meiner Meinung schon daher falsch, weil $classname gar kein Klassenobjekt, sondern ein String ist. Müsste also auch ein Fehler werfen.
 
Wie lautet denn der PHP Fehler genau? Ich hatte z.B. einen PHP Fehler bekommen, weil ich vergessen hatte, die getInstance() als static zu definieren.

Das mit dem Pfeil ist meiner Meinung schon daher falsch, weil $classname gar kein Klassenobjekt, sondern ein String ist. Müsste also auch ein Fehler werfen.

Eine Fehlermeldung gibt es noch nicht, ich kann aber schon beim bauen sehen, das es nicht so klappen wird, wie ich mir das gedacht habe ;)

Gültiger Code wäre (nach zend Studio) dieser:
PHP:
$this->$classdata = $classdata->getInstance();

Das setzt aber vorraus, das "$classdata" schon ein Object der Klasse "base" wäre und "getInstance" eine methode der "base"-Klasese, dem ist aber nicht so.

Diese müsste eigentlich so aussehen:

PHP:
$this->$classdata = $classdata::getInstance();

Um die Instance der Klasse, die gerade geladen werden soll, als Object in der "base"-Klasse zu haben....und hier liegt auch das Problem:

PHP:
$classdata::getInstance();

Das wäre ein Parse-Error....aber genau so wird es benötigt, um obenstehendes zu erreichen ;)

Wie kann ich also Singleton UND Factory-Pattern per Autoload nachladen?
 
Zuletzt bearbeitet:
Ohne Test oder schonmal getestet zu haben, wie sieht es mit

PHP:
{$classdata}::getInstance();

aus?
Mit den geschweiften Klammern kann man ja immer etwas zusammenfassen. Maybe tut es ja... nur geraten :D:D
 
PHP:
class test
{
	static function &getInstance()
	{
		static $inst;
		if(!isset($inst)) $inst = new self();
		
		return $inst;
	}
}

$cl = "test";

$t = &$cl::getInstance();

var_dump($t);
Geht ohne Probleme...
 
PHP:
class test
{
	static function &getInstance()
	{
		static $inst;
		if(!isset($inst)) $inst = new self();
		
		return $inst;
	}
}

$cl = "test";

$t = &$cl::getInstance();

var_dump($t);
Geht ohne Probleme...

Das es geht, ist uns ja bekannt, ich wollte die neuen Object aber dem Klassennamen entsprechend haben, weil ich ja später alles über die "base"-Instance aufrufen wollte, da ist es dann schon besser, wenn die Klassen, die per autoload nachgeladen werden, auch einem entsprechenden Object zugeordnet werden (zb. Session-Klasse = "session", user-klasse = "user" und über "$base->user->get_user_id()" oder "$base->session->session_destroy();" aufgerufen werden können.
 
Zurück