Class erzeugen
MichaelR
- php
Hallo,
in einem PHP-Script erzeuge ich eine Instanz einer Klasse, z. B.
class ObjectEins {
...
}
mittels $elm = new ObjectEins;
Die obige Klasse erzeugt ihrerseits wiederum eine neue Instanz einer anderen Klasse
class Subobject {
...
function Sayhello(){
print "hallo";
}
}
in der Form:
class ObjectEins {
var $obj;
function Neu(){
$this->obj = new Subobject;
}
...
}
Erstens würde mich mal interssieren ob es schlecht ist, KLassen in anderen Klassen zu erzeugen? (Falls ja, wäre das schlecht für mich, da ich mit dem jetzigen Aufbau meines php Scripts eine gute Übersicht hab; ich könnte zwar die Subobject-Klasse in die Hauptklasse einbauen, da davon aber mehrere existieren würde die Übersicht schnell verloren gehen...).
Die zweite Frage: Wenn ich auf die Funktion des Subjobject zugreifen will
$elm->obj->Sayhello();
bekomme ich immer eine Fehlermeldung, dass die Funktion undefiniert sei und nicht gefunden werden könne ???
Um die Kuriosität zu vervollständigen: wenn ich über eine andere Funktion innerhalb von Subobject einfach nur Werte zuweise an dortige Variablen und dann mir mit print irgendwas ausgeben lasse, klappt das...
Man kann also sagen: wenn ich auf Funktionen der Subklasse zugreifen möchte, die mir praktisch etwas zurückgeben sollen, gibt's ne Fehlermeldung.
Sieht jemand vielleicht meinen Denkfehler? Oder sonstigen Fehler?
Danke + Grüße
Michael
Hallo Michael,
Erstens würde mich mal interssieren ob es schlecht ist, KLassen in anderen Klassen zu erzeugen?
Ich hoffe ich habe Dich richtig verstanden, mal schaun... Also was Du vor hast nennt man glaub ich "überladen von Klassen" und ist in PHP nur mit einem solchen Trick zu lösen. Ich persönlich habe es glaub ich noch wie wirklich verwendet, ich kenne aber Leute aus der Java-Ecke die das exzessiv betreiben :-D Mir ist das in der Tat ein wenig zu unübersichtlich, aber falsch ist es denke ich mal nicht. Ich schreibe lieber jede Klasse in eine eigene Datei und instanziere das Objekt explizit in der Datei in der ich es brauche. Das geht ganz gut wenn man alle Klasse in eine class.inc schreibt und diese included. So hat man immer Zugriff auf alle Klassen. Zur Zeit arbeite ich an einen grossen Projekt mit. Dort verwenden wir in der Tat eine Art Superklasse, einen sog. Controller der bestimmte Klassen instanziert und auch schon zum Teil konfiguriert. Das macht z.B. bei Template-Klassen Sinn, in unseren Fall ist das Smarty. Sehr praktisch dann in der Anwendung, wie z.B. $superclass->smarty->assign($foo, $boo); im Kopf der Datei steht dann immer nur $superclass = new SuperClass(); oder so...
Zu Deiner Fehlermeldung:
bekomme ich immer eine Fehlermeldung, dass die Funktion undefiniert sei und nicht gefunden werden könne ???
Wenn ich es recht gesehen habe hast Du vergessen die Methode >Neu< aufzurufen, somit kann er natürlich auch nicht das dort instanzierte Objekt >Subobject< finden. Um das zu erreichen musst diese Methode in dem Konstruktor Deine Klasse aufrufen, etwa so:
----------------------------------------------------------
<?php
class subobject
{
// Constructor of Class subobject
function subobject()
{
}
// Method to say Hello
function sayhallo()
{
echo( "Hello" );
}
}
class mainobject
{
//Membervariable $subclass
var $subclass = "";
// Constructor of Class mainobject
function mainobject()
{
$this->newsubclass();
}
function newsubclass()
{
$this->subclass = new subobject();
}
}
$newclass = new mainobject();
$newclass->subclass->sayhallo();
?>
----------------------------------------------------------
Ich habs mal an einem eigenen Beispiel getestet, das Script läuft soweit. Bei Dir ist wahrscheinlich alles soweit richtig, es fehlt halt in deiner Hauptklasse der Konstruktor. Dieser macht nichts anderes als die entsprechende Methode - welche das neue Objekt instanziert - aufzurufen.
Ich hoffe ich konnte Dir helfen und ich hoffe auch ich hab hier kein Bockmist erzählt. Falls es jemand besser weiss darf dieser mich gerne korrigieren, ich bin leider auch nicht der PHP-Guru...
Gruss AndreD
Hallo AndreD,
Danke für deine Antwort. Werde heute Abend das ganze bei mir mit dem Konstruktor mal überprüfen und schauen ob's daran lag.
Ciao
Michael