Willkommen in der Webstatt Zum Webstatt Blog und Stories
Dustwolf Dustwolf am 03.12.06 22:23

Moin.

Also ich mache mir gerade Gedanken zu einer etwas komplexeren Objektstruktur.

Wenn ich es mal ganz einfach zusammenfasse, dann habe ich eine Class, in der ich die Variablen
private $fehler;
private $template;
benutze, um darin mit $this->fehler = new fehler; und $this->template = new templates; die Objekte des Fehlersystems und des Templateobjekts anzulegen.

Früher machte man das ja scheinbar mit &new und nun nur noch mit new. Habe ich zwar nicht ganz verstanden, aber es funktioniert so auf jeden Fall. Das hatte ja was mit Referenz und Anlegen zu tun.

Wenn ich nun davon ausgehe, dass meine Templateclass auch auf die Fehlerclass zugreifen können soll, dann muss ich das ja mit ner Referenz machen. Ich will die Class ja nicht nochmal anlegen, wenn einmal genügt.
Ich dachte, dass ich dazu einfach in templates einen Konstruktor anlege, dem ich dann die Variable $fehler übergebe und diese die Referenz auf die Fehler-Class enthält. Diese Referenz muss ich ja nur in der fehler-Class als Variable ablegen, um darauf zugreifen zu können.

Daher:
Hauptobjekt:
<?php

class system {

private $template;
private $fehler;

$this->fehler = new fehler;
$this->template = new templates($this->fehler);

}

?>

Templates-Objekt:
<?php

class templates {

private $fehler;

function construct ($fehler){
$this->fehler = $fehler;
}

public function test ($test){
if (!$test)
$this->fehler('Fehlertext');
# Hier kommt ein Fehler: "Fatal error: Call to undefined method templates::fehler() in [...]"
}

}

?>



Wie schaffe ich es also von einem Objekt auf ein anderes Objekt zu verweisen, wenn beide Objekte in einem übergeordneten Objekt angelegt wurden?

Danke schonmal für alle Antworten!

netcup.de Warum gibt es hier Werbung?
Wasili am 04.12.06 07:59

Ich mache es bei mir so: Ich übergebe den Kindelementen jeweils eine Referenz auf die Eltern. Funktioniert ganz gut:

class System {
public $fehler;
public $template;

public function __construct() {
$this->fehler = new Fehler(&$this);
$this->template = new Template(&$this);
}
}

class Fehler {
public $parent;

public function __construct($parent) {
$this->parent = &$parent;
}
}

class Template {
public $parent;
const TEMPLATE_NOT_EXISTS = 64; // pow(2, 6);

public function __construct($parent) {
$this->parent = &$parent;
$this->parent->fehler->throw(self::TEMPLATE_NOT_EXISTS, 'Fataler Fehler: Das angegebene Template existiert nicht!');
}
}

Dustwolf Dustwolf am 04.12.06 13:28

Also sehe ich das richtig, dass man so verknüpft und ich quasi das Objekt jedesmal beim Übergeben neu angelegt habe?

Aber auf jeden Fall danke ich. Es lag aber an was anderem... Vor lauter gleichen Bezeichnern hab ich aus:

$this->fehler->fehler();

$this->fehler();

gemacht. :D

Wasili am 04.12.06 17:34

Wenn ich nun richtig verstehe, was du meinst, dann: Jein.
In PHP 4 hättest du jedes mal das Objekt "geklont". PHP 5 legt immer eine Referenz an - Naja, ich finde es einfach klarer, was gemeint ist, wenn ich das & da hin schreibe, anstatt es wegzulassen... ;)

Rebel4s Rebel4s am 06.12.06 20:05

was bedeutet das & vor einer Variable oder ein _? Kenn mich mit PHP5 noch nicht so aus.

Snake am 06.12.06 20:27

_ ist reine formatierung(abgesehen von ein paar definierten sonderfunktionen, die aber einfach so definiert wurden und nicht direkt was mit dem _ zu tun haben), das & macht eine referenz (in anderen sprachen auch pointer bzw. zeiger genannt) auf die var.

bsp:
<?php
$a = 1;
$b = &a;
$a = 2;
echo $b; // 2

Rebel4s Rebel4s am 07.12.06 15:14

Quote
Original von Snake
_ ist reine formatierung(abgesehen von ein paar definierten sonderfunktionen, die aber einfach so definiert wurden und nicht direkt was mit dem _ zu tun haben), das & macht eine referenz (in anderen sprachen auch pointer bzw. zeiger genannt) auf die var.

bsp:
<?php
$a = 1;
$b = &a;
$a = 2;
echo $b; // 2


also wird durch das & die Variable immer aktuell gehalten.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt