PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kann eine Klasse in einer Eigenschaft ein Objekt, einer anderen Klasse instanzieren?


Balthazzar
05.07.2006, 20:54:08
Hallo Leute!

Meine Frage ist wie im Titel:
Kann eine Klasse in einer Eigenschaft ein Objekt, einer anderen Klasse instanzieren?

Wenn ich den dazu gehörigen Code ausführe, sagt PHP mir dazu folgendes:

Fatal error: Call to a member function output() on a non-object in *.php on line *


Der Code ist folgender und dient dem Zweck HTML-Code an den Browser zu geben. (Hier wegen der Länge nur Ausschnittsweise, gekürzt und vereinfacht):

Die Methode der 1. Klasse, die das Objekt instanzieren soll:

<?php
function add_text($content) {
$this->content[] = new text($content);
}
?>


Die Methode in der eine Methode auf dieses Objekt ausgeführt werden soll:

<?php
function output() {
echo '<p>';
$contents = $this->get_content();
foreach($contents as $content) {
$content->output(); //hier passiert natürlich laut PHP der Fehler
}
echo '</p>';
}
?>

Normalerweise werden nicht nur <p>-Elemente ausgeben sondern auch andere anhand anderer Eigenschaften uns es werden auch noch diverse Attribute hinzugefügt.
Zu der Methode get_content(): Sie gibt lediglich die Eigenschaft Content zurück; im Prinzip wäre also auch $this->content; möglich.
Desweiteren können der Eigenschaft content auch wieder HTML-Elemente hinzugefügt werden mit Hilfe einer Methode, die diese ins Array content schiebt. Die muss ich ja einzeln instanzieren weil sie normalerweise Inhalt haben im Gegensatz zum Text.

Schließlich die Methode in der 2.Klasse die auf das Objekt, das in der 1. Klasse instanziert wird, angewendet werden soll:

function output() {
echo $this->content;
}

Gehört zu der 2.Klasse also keine Überladung.

Ja, das Problem ist nen bissl' kompiliziert :P.
Ich hoffe ihr könnt mich trotzdem verstehen.

Danke im Vorraus an alle die sich meinem Problem widmen.

Edit: Denke mal hab das falsche Topic erwischt oder ist das hier richtig aufgehoben?

Opendix
05.07.2006, 20:58:37
hä? ich versteh dein Problem net :S

also du hast 2 Klasse. (A und B)

class A
{
private $vari;

function add_text()
{
$this -> vari = new B();
}
}

class B
{
function output()
{

}
}


und was willst du nun genau mit diesen beiden Klassen machen?
evtl bin ich auch bisschen schwer von begriff aber raffs grad net :P

btw. auf welcher zeile kommt den dieser Fehler?

Balthazzar
05.07.2006, 21:37:37
So ok dann mal tutti completti als Klassen ausgedrückt.
(eigentlich wollt ich nicht mals mehr pseudo-italienisch nach der niederlage gestern sprechen und schreiben ^^)

<?php
class HTML {
public $content = array();

function add_text($content) {
$this->content[] = new text($content);
}

function add_content($content) {
$this->content[] = $content;
}

function output() {
echo '<p>';
$contents = $this->content;
foreach($contents as $content) {
$content->output(); //hier passiert laut PHP der Fehler!!!!!!!
}
echo '</p>';
}
}

class text {
public $content = array();

function __construct($content) {
$this->content[] = $content;
}

function output() {
echo $this->content;
}
}
$bla = new HTML;
$blub = new HTML;
$bla->add_content($blub);
$blub->add_text('Dieses Objekt bringt PHP zum scheitern!');
$bla->output();
?>


Ausgabe des ganzen ist:
<p><p>Array</p></p>
Wie zum Teufel kommt PHP nun darauf einfach "Array" auszugeben?

Hoffe nun weiß man was ich vorhabe.
Danke schonmal.

Opendix
05.07.2006, 21:57:39
ok jetzt hab ich verstanden!

also der Fehler kommt daher:
In der Klasse HTML(welche übrigens nicht wirklich den namens-konventionen entspricht..) hast du die Klassenvariabel $content welche selbst ein Array ist.

mit der Funktion add_text() fügst du nun einfach einen String hinzu!

nach deinem beiden add-funktionen hat die Klassenvariabel also folgenden inhalt:
$content[0]: Ein Objekt vom Typ HTML
$content[1]: Ein String

nun wenn du da output auf alle elemente anwendest ist klar, dass der Strign die Funktion output() nicht besitzt!

warum PHP da Array ausgibt ist auch klar... in der Klasse text ist $content wiederum ein Array. wenn du ein Array einfach mit echo $array ausgibst dann wird dir PHP immer "Array" ausgeben!

So hoffe konte dir helfen;)

Balthazzar
05.07.2006, 22:58:58
Ich wollte mich schon immer einmal selbst zitieren:


<?php
$this->content[] = new text($content);
?>



Aber ich erzeuge doch ein Objekt, welches ich ins Array content der Klasse HTML lege, die ich übrigens nur der Einfachheit nach so nannte (Aber hast natürlich recht mit den Namenskonventionen) ;).
Also kann doch im Array kein einfacher String liegen.
Vorallem weil ja die Methode output() von der Klasse text ausgeführt wird.

Mit dem Array hast du natürlich recht, ich vergaß das, als ich den Code auf ein Minimales herunterkürzte. ;)

Glaube ich experimentiere mal nen bissl' mit var_dump() rum. Dann müsste sich der Fehler finden lassen.

Danke schonmal soweit.
(Vielleicht ergeben sich ja weitere Probleme. Will es aber mal nicht hoffen. ;))

Edit: Hab Problem mit var_dump() gefunden nen echtes Ultimativ-Diagnostikum diese Funktion^^.

Opendix
06.07.2006, 00:06:22
nun was wars? :)

Balthazzar
06.07.2006, 17:06:36
Eigentlich nicht erwähnenswert und ich finde es auch peinlich,
habe ich doch eigentlich alles abgesucht auf Fehler bei der Erzeugung der Objekte.
Ich habe an die Methode add_content() eine falsche Variable per Parameter übergeben. Konnte es dann feststellen als ich mir den Inhalt von ein paar Variablen mit var_dump() ausgeben lies.
Ich hab natürlich direkt am Anfang daran gezweifelt das es generell nicht möglich wer ein Objekt in einer Eigenschaft zu instanzieren, aber es geht ohne Probleme.