Hi,
vorweg ein paar Kleinigkeiten:
-Du solltest deine Klasse nicht "construct" nennen. Es ist kein
reserviertes Wort, aber leicht mit "__construct" welches bei PHP für den Konstruktor steht, zu verwechseln.
-Dann ist es sinnvoll Klassennamen groß zu schreiben.
-Wie du in deiner Funktion schon richtig geschrieben hast instanziert man eine Klasse (nicht starten).
-Das Schlüsselwor "var" für Klassenvariablen gibt es in PHP5 nicht mehr. Dort kennzeichnest du die
Klassenvariablen mit public,private oder protected.
-Wenn du eine Klasse instanzierst, dann solltest du dir angewöhnen die Klammern zu setzen. ("new Foo()")
Ohne es vll. zu wissen, hast du das
Factory Pattern angewandt
Jetzt zu deiner Problematik.
Der Aufruf: $c->user->foobar() funktioniert, aber wenn ich $c->getDebug() ausführe, erhalte ich nur Debug-Nachrichten aus der construct-class.
Wenn du $c->getDebug aufrufst, dann ist es klar, dass du nur die Debugnachricht der construct-Klasse erhälst, da diese Klasse nichts von Ihren Kindklassen weiß. Um das zu realisieren, musst du mit static arbeiten, so, dass die Debugvariable nicht immer für jede Klasse neu gesetzt wird, sondern alle die selbe Variable nutzen, dann funktioniert dein Vorhaben.
Was du da vorhast ist nicht sonderlich schön.
Exkurs:
Das Factory Pattern macht Sinn, wenn man z.B eine Klasse mit mehreren Adaptern besitzt.
Bei DB Klassen sieht man das häufig. Als Beispiel gibt es den Adapter "MySQL" der eine eigenständige Klasse darstellt. Dann kann man z.B so die DB Klasse mit dem Adapter MySQL instanzieren: $db = new DB("MySQL"); Wobei dann die Adapterklasse MySQL mittels dem Factorypattern instanziert wird.
Besser ist es, wenn du deine Klassen eigenständig instanzierst und alles was zur Debuglogik gehört auch in die Debuggerklasse packst, denn alle anderen Klassen brauchen davon nichts wissen und die interessiert das auch nicht.
Um das vernünftig umzusetzen brauchst du lediglich das
Singleton Pattern einsetzen.
So könnte die Implementierung aussehen :
|
PHP Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
<?php
class Debugger
{
private $debugMessages = array();
static private $instance = null;
public static function getInstance(){
if(self::$instance === null){
self::$instance = new Debugger();
}
return self::$instance;
}
private function __construct() {}
private function __clone() {}
public function addDebugMessage($message) {
$this->debugMessages[] = $message;
}
public function getDebugMessages() {
return $this->debugMessages;
}
}
class User
{
public function saveData($data = array()) {
// la la la ... Programmlogik
Debugger::getInstance()->addDebugMessage(get_class($this) . " says data saved");
}
}
class DB
{
public function connect($host) {}
public function persist($object) {
// Daten in die DB schreiben ....
Debugger::getInstance()->addDebugMessage(get_class($this) . " says data saved");
}
}
$db = new DB();
$db->connect("localhost");
$user = new User();
$user->saveData(array("username"=>"new-user-name"));
$db->persist($user);
$debugMessages = Debugger::getInstance()->getDebugMessages();
foreach($debugMessages as $m) {
echo "Nachricht: " . $m . "<br />";
}
// AUSGABE
// Nachricht: User says data saved
// Nachricht: DB says data saved
|