Portal > Foren > PHP > PHP-Programmierung > Klassenhirarchie - Problem
Antwort
 
Themen-Optionen
Alt 22.04.2006, 11:53 Nach oben    #1
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Klassenhirarchie - Problem

Tag,
ich hab ein kleines Problem mit einer Klassenhirarchie bei einem eigentlich kleinen Script von mir. Ich beschreibe die Situation mal kurz. Vorweg: Ich habe in diesem Fall nur PHP4 auf dem Server zu verfügung. Die Konstante ROOT wird zwar hier nicht gesetzt, ist aber vorhanden und zeigt auf soetwas wie /php .
Ich habe 3 Klassen, class1, class2 und class3. Diese Laufen in einem kleinen "Framework" im classLoader zusammen, etwa so:
PHP-Code:
<?php
require_once(ROOT '/classes/class.class1.php');
require_once(
ROOT '/classes/class.class2.php');
require_once(
ROOT '/classes/class.class3.php');

class 
framework {
        function 
framework () {
                
$this -> class1 = &new class1;
                
$this -> class2 = &new class2;
                
$this -> class3 = &new class3;
        }
}
?>
In der (derzeitigen) index.php hole ich mir also das Framework:
PHP-Code:
<?php
require_once(ROOT 'classLoader.php');
class 
index extends framework {
        function 
index() {
                
$aEntries = &$this -> class3 -> loadEntries();
        }
}

new 
index;
?>
Nun komme ich aber zum eigentlichen Problem. In einer von den 3 Klassen (nehmen wir mal class3) brauche ich viele Methoden und auch Variablen, die in class2 vorhanden sind (class2 ist mysql, class3 übernimmt die ganzen Aufgaben wie Beispielsweise Daten aus der Datenbank holen). Das sieht dann etwas so aus (in der class3
PHP-Code:
<?php
class class3 {
        function 
loadEntries() {
                
// Hier muss ich nun auf class2 zugreifen.
        
}
}
?>
Ich habe jedoch keine Möglichkeit dazu gefunden. Eventuell irgendwie mit parents arbeiten, aber dann müsste ich ja irgendwelche komplizietren extends-Strukturen aufbauen. Gibt es auch noch andere Möglichkeiten, außer dass ich notfalls die komplette class3 in die class framework verlege?

//edit
Dann nochwas zum setzen von ROOT. Ich hatte das vorher noch mit getcwd() gelöst, aber dies scheint nicht die beste Lösung zu sein (laut php.net). Jetzt habe ich das:
PHP-Code:
<?php
// Not using getcwd() because getcwd() causes problems on some servers
define('ROOT'str_replace('/' basename($_SERVER['PHP_SELF']), ''$_SERVER['SCRIPT_FILENAME']));
?>
Wie macht ihr das?
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (22.04.2006 um 12:21 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 12:29 Nach oben    #2
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Einzige vernünftige Lösung wäre, die benötigten Objekte im Konstruktor per Referenz zu übergeben.

Alternative wäre eine extend-Struktur, in der class3 von class2 und class2 von class1 erbt.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 12:34 Nach oben    #3
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von Lars
Einzige vernünftige Lösung wäre, die benötigten Objekte im Konstruktor per Referenz zu übergeben.

Alternative wäre eine extend-Struktur, in der class3 von class2 und class2 von class1 erbt.
In welchem Konstruktor meinst du? Kannst du mir ein Beispiel geben? Die extend-Struktur hatte ich oben auch schon erwähnt, aber das wollte ich eher umgehen.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 12:38 Nach oben    #4
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

class1 macht die Datenbankabstraktion.
class2 schreibt und liest die Daten, braucht daher class1.
class3 braucht die Daten von class2.

Du übergibst also dem Konstruktor von class2 ein Objekt von class1 und dem Konstruktor von class3 ein Objekt von class2. Wenn du in class3 auch den direkten DB-Zugriff brauchst, musst du auch noch das Objekt von class1 übergeben.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 12:44 Nach oben    #5
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von Lars
class1 macht die Datenbankabstraktion.
class2 schreibt und liest die Daten, braucht daher class1.
class3 braucht die Daten von class2.

Du übergibst also dem Konstruktor von class2 ein Objekt von class1 und dem Konstruktor von class3 ein Objekt von class2. Wenn du in class3 auch den direkten DB-Zugriff brauchst, musst du auch noch das Objekt von class1 übergeben.
Hm ja das wäre möglich. Aber dann fände ich es nicht mehr so "praktisch". . Die Klassen sind eigentlich mehr oder weniger "statische" Klassen. Soll heißen sie werden unabhängig von meinem Projekt immer weiterentwickelt und haben einen festen Quellcode. Sie bedingen sich zwar gegenseitig, jedoch kann ich jetzt die Datenbankabstraktionen auch von einer ganz anderen Klasse verlangen - und dann ist das mit der Objektübergabe wieder doof. Vorallem dann, wenn ich die Datenbankklasse alleine brauch. Von daher wäre dies nicht ganz die eleganteste Art. Bleibt dann sonst noch was über, außer wirklich die extends-Strukturen aufzubauen? =/
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 13:04 Nach oben    #6
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Keine Ahnung, ob es das in PHP4 schon gibt, aber du kannst statische Variablen verwenden.
Du speicherst die Objekte deiner drei Klassen in statischen Variablen in der framework-Klasse und kannst dann mittels framework::$class1 drauf zugreifen.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 13:30 Nach oben    #7
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Hm ich hab das mal mit den statischen Variablen unter PHP4 versucht. Unterstützt werden sie: http://de3.php.net/static#language.v...s.scope.static

classLoader.php:
PHP-Code:
<?php
class framework {
        function 
framework () {
                static 
$mysql;
                static 
$template;
                static 
$guestbook;
                
                
$mysql = &new mysql_connection;
                
$template = &new template;
                
$guestbook = &new guestbook;
       }
}
?>
Nun komm ich aber irgendwie nicht mehr weiter. So ist es bisher doch richtig, oder? (Hab noch nie pur-objektorientiert programmiert, gerade das will ich ja üben). Wie greife ich nun in der index.php darauf zu?
index.php:
PHP-Code:
<?php
class index extends framework{
        function 
index() {  
                
$this -> loadEntries();
        }
        
        function 
loadEntries() {    
                
$aEntries this::$guestbook -> loadEntries();      
        }
}
?>
So irgendwie? :-S So bekomm ich allerdings den Fehler:
Zitat:
Notice: Undefined variable: guestbook in /guestbook/index.php on line 19

Fatal error: Undefined class name 'this' in /guestbook/index.php on line 19
$this->guestbook::loadEntries(); auch nicht. Hilfe
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (22.04.2006 um 13:39 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 13:39 Nach oben    #8
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Es muss
PHP-Code:
self::$var $value;
// oder
MyClass::$var $value
heißen

Bei deinem Serverhänger sollte eigentlich "Using $this when not in object context" kommen.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 13:53 Nach oben    #9
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Also so ganz steig ich immer noch nicht durch, sorry. Static kenn ich nur so, dass ich es in einer Funktoin benutzen kann um die Variable zu erhalten:
PHP-Code:
<?php
function blubb () {
        static 
$var 0;
        
$var ++;
        return 
$var;
}
?>
Ruf ich blubb() auf so bleibt mir $var erhalten und erhöht sich immer um 1. Ohne static ginge die Variable ja immer "verloren" und ich würde immer nur 1 zurückbekommen. Ich wüsste jetzt aber nicht wie static in dieser Form nützlich für mich sein könnte? Denn diese Variable ist und bleibt ja doch nur in der Funktion, nicht aber in der Klasse, sodass ich mit beispielsweise $this-> darauf zugereifen kann, oder?

In PHP4 kann ich static variablen nur in Funktionen deklarieren, keine AHnung wie das jetzt in php5 ist. Sowas wie
PHP-Code:
<?php
class test {
       static 
$var 'blubb';
}
?>
geht jedenfalls nicht.
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (22.04.2006 um 13:55 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 14:00 Nach oben    #10
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Statische Klassenvariablen sind nicht an ein Objekt der Klasse gebunden, wie z.B. $this->var. Sie werden also direkt in der Klassendefinition gespeichert und nicht im Objekt.
PHP-Code:
class MyClass
{
  static 
$instanceCounter 0;

  function 
MyClass()
  {
    
self::$instanceCounter++;

    
printf('Dies ist die %d. Instanz von %s.'self::$instanceCounter__CLASS__);
  }

Auf die statische Variable kann von überall zugegriffen werden, was in deinem Fall wichtig ist. In class3 kann also auf framework::$class2 usw. zugegriffen werden.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 14:04 Nach oben    #11
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Jou. Dann fällt das in PHP4 weg. Das ist nämlich noch nicht möglich. Schade eigentlich, ich bin grad selber dabei das zu lesen. PHP4 unterstützt die staticdeklarationen in der Klasse selbst noch nicht..

//letzter Edit
Okay, in diesem speziellen Fall kann ich noch mit extended eine Hirarchie aufbauen.
VIelen dank aber für deine Hilfe
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (22.04.2006 um 14:15 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 14:14 Nach oben    #12
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Also die Objekte dem Konstruktor mitgeben
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 14:20 Nach oben    #13
Jay
Gast
 
Beiträge: n/a
Standard

brauchst du class2 nur in class3?
Dann kannst du die nämlich gleich in class3 instanzieren.

Root hab ich im Core des Shops so gemacht:
define ('ROOT', dirname (__FILE__));

MfG Fat Tony
 
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2006, 14:23 Nach oben    #14
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
brauchst du class2 nur in class3?
Dann kannst du die nämlich gleich in class3 instanzieren.
So hab ichs jetzt dann doch letztendlich gelöst, weil ich das auch eingesehen hab. Ist aber in diesem Fall leider eine Ausnahme. Das nächstemal versuch ich bereits bei PHP5 zu sein.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem E-Mails zu senden Jann Hendrik Plauderecke 7 25.05.2007 21:37
Logisches Problem beim einsatz von Ereignissen Prophet Allgemeine Java-Programmierung 19 05.06.2006 22:08
Problem mit Cookie und Reloads... Bookworm PHP-Programmierung 10 13.04.2006 12:09
OSX + Eclipse 3.1 Problem bacarni Eclipse 3 29.07.2005 21:19
Kugel bewegen - Problem mit dem Ansatz Ben Desktop-Applikationen und Grafik 5 11.04.2005 17:50


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:04 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

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