Guten Tag!
Folgender Sachverhalt:
Zu einem bestimmten Problem habe ich mehrere Klassen und eine sogenannte Managerklasse fuer diese entwickelt. Die Managerklasse handhabt und "wrappt" den Zugriff auf die Objekte der anderen Klassen, die als private Member initalisiert werden.
Extremes Beispiel zur Verdeutlichung:
Stellt euch nun vor, ich braeuchte nur einige dieser Klassen immer und die anderen eher selten. Diese anderen Klassen wuerden den Speicher (bzw. den Server) bei einer Nichtverwendung sinnlos belasten, was aber definitiv nicht mein Ziel ist.
Dafuer habe ich die magische Funktion __get() in der Klasse Manager implementiert. Soweit, so gut. Jetzt aber das eigentliche Problem:
Auf diese Art und Weise (die mir einzig bekannte) vergisst PHP5 das private-Attribut.
(Diese Verfahrensweise nennt man "Lazy Initialization")
Man kann trotz des private-Attributes noch von aussen zugreifen. Eine Definition "private $InstanceOfAnotherClass" würde keinen Sinn ergeben, da PHP die Funktion __get() aus den Methoden dieser Klasse nicht aufrufen würde, denn fuer diese gilt ja der Zugriff auf private Member.
Hat jemand dieses Problem schon mal gehabt und eventuell sogar eine Loesung parat?? Gibt es irgendwelche Internetseiten, die fuer dieses Problem eine Loesung bieten? Meine Suche ueber Google blieb erfolglos.
Vielen Dank im Voraus.
PS. Es gibt anscheinend Probleme mit der Codierung eurer Webinhalte! (anstatt z.B. eines "ö" kommt bei mir "?", Mozilla Firefox 1.0.7)
Folgender Sachverhalt:
Zu einem bestimmten Problem habe ich mehrere Klassen und eine sogenannte Managerklasse fuer diese entwickelt. Die Managerklasse handhabt und "wrappt" den Zugriff auf die Objekte der anderen Klassen, die als private Member initalisiert werden.
Extremes Beispiel zur Verdeutlichung:
PHP-Code:
<?php
require 'AnotherClass.php';
class Manager
{
private $InstanceOfAnotherClass;
public function __construct()
{
$this->InstanceOfAnotherClass = new AnotherClass();
}
// Eine in diesem Fall sinnlose Wrapperfunktion
public function MakeThis()
{
return $this->InstanceOfAnotherClass->foo();
}
}
$bar = new Manager();
print $bar->MakeThis(); // Wrapper
print $bar->InstanceOfAnotherClass->foo(); // resultiert, wie gewuenscht, in einem Fehler
?>
Dafuer habe ich die magische Funktion __get() in der Klasse Manager implementiert. Soweit, so gut. Jetzt aber das eigentliche Problem:
Auf diese Art und Weise (die mir einzig bekannte) vergisst PHP5 das private-Attribut.
(Diese Verfahrensweise nennt man "Lazy Initialization")
PHP-Code:
<?php
class Manager
{
// Hier darf die Membervariable $InstanceOfAnotherClass noch nicht definiert sein
public function __construct()
{
// Hier wird ersteinmal nichts gemacht
}
// Auch mit private Klappt es nicht
private function __get($member)
{
switch ($member):
case 'InstanceOfAnotherClass':
// Erst beim Gebrauch laden und instanziieren
include 'AnotherClass.php';
$this->InstanceOfAnotherClass = new AnotherClass();
return $this->InstanceOfAnotherClass;
break;
// Den Rest lassen wir jetzt einmal aussen vor
endswitch;
}
// Eine in diesem Fall sinnlose Wrapperfunktion
public function MakeThis()
{
// Erwuenscht: Initalisierung erst beim Aufruf durch eine Wrapperfunktion, die Classmember ist
return $this->InstanceOfAnotherClass->foo();
}
}
$bar = new Manager();
// erwuenscht, da Wrapper
print $bar->MakeThis();
// unerwuenscht, aber leider moeglich: $InstanceOfAnotherClass sollte private sein
print $bar->InstanceOfAnotherClass->foo();
?>
Hat jemand dieses Problem schon mal gehabt und eventuell sogar eine Loesung parat?? Gibt es irgendwelche Internetseiten, die fuer dieses Problem eine Loesung bieten? Meine Suche ueber Google blieb erfolglos.
Vielen Dank im Voraus.
PS. Es gibt anscheinend Probleme mit der Codierung eurer Webinhalte! (anstatt z.B. eines "ö" kommt bei mir "?", Mozilla Firefox 1.0.7)
Kommentar