WinFuture-Forum.de: Php Klassen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Php Klassen


#1 Mitglied ist offline   Skiller 

  • Gruppe: aktive Mitglieder
  • Beiträge: 164
  • Beigetreten: 06. September 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Negenborn

geschrieben 08. September 2009 - 20:49

Hi,

ich hab da mal wieder eine Frage.

Ich würde gerne die Methoden / Eigenschaften der Klasse DB und Login der Klasse Init vererben aber wie Funktioniert das?

Beispiel:
class db extends init{}
class login extends init{}

class init{}


Das das so nicht funktionieren kann ist mir klar (so würden die Methoden von Init an DB vererbt werden) aber wie kann ich das realisieren?

Ich würde dann gerne die Methoden aus DB und Login wie folgt aufrufen:
$init = new init();
$init->dbConnect();
$init->loginForm();


MFG Skiller
0

Anzeige



#2 Mitglied ist offline   mibtng 

  • Gruppe: aktive Mitglieder
  • Beiträge: 298
  • Beigetreten: 03. Juni 05
  • Reputation: 0

geschrieben 08. September 2009 - 21:03

Gar nicht. Mehrfachvererbung ist sowieso nicht unproblematisch. Stattdessen könntest du mit Interfaces arbeiten, oder der Klasse init zwei Instanzvariablen reinmachen vom Typ db und login (bzw nur eine Instanzvariable machen, z.B. vom Typ login, und die Klasse init von db ableiten)

Sinnvoller wäre es vermutlich das Klassendesign zu überdenken... aber da fehlt dir vermutlich eh zu viel Erfahrung...

Dieser Beitrag wurde von mibtng bearbeitet: 08. September 2009 - 21:05

0

#3 Mitglied ist offline   Skiller 

  • Gruppe: aktive Mitglieder
  • Beiträge: 164
  • Beigetreten: 06. September 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Negenborn

geschrieben 08. September 2009 - 21:16

Danke für die Antwort.

Gib mir doch bitte mal ein Tipp wie ich das Klassendesign verbessern könnte.

Ich wollte in init alle Methoden und Eigenschaften vereinen um einfacher auf diese zugreifen zu können.
Natürlich wird sich die Liste der Klassen noch deutlich erweitern.

Als Beispiel hatte ich mir hier das open source CMS Typolight angesehen, dort sind auch alle Methoden über die Main Klasse Adressierbar, obwohl unter Klassen für die Mysql Verbindung oder für die Verarbeitung von Login Sessions etc. bestehen.

Dieser Beitrag wurde von Skiller bearbeitet: 08. September 2009 - 21:17

0

#4 Mitglied ist offline   [Elite-|-Killer] 

  • Gruppe: aktive Mitglieder
  • Beiträge: 762
  • Beigetreten: 02. Oktober 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Passau

geschrieben 08. September 2009 - 22:06

class login
class db extends login
class init extends db

Aber sauber ist das nicht wirklich, weil db etwas vergewaltigt wird bei der Sache.

Bzw. Phyton unterstützt Mehrfachvererbung.
0

#5 Mitglied ist offline   mibtng 

  • Gruppe: aktive Mitglieder
  • Beiträge: 298
  • Beigetreten: 03. Juni 05
  • Reputation: 0

geschrieben 08. September 2009 - 22:16

Die Frage ist doch, wieso man überhaupt eine Klasse init braucht? Vor allem die wird ja vermutlich eh nur einmal mit $init instanziert...

Warum muss diese können was die Klasse db und die Klasse login kann?
0

#6 Mitglied ist offline   Skiller 

  • Gruppe: aktive Mitglieder
  • Beiträge: 164
  • Beigetreten: 06. September 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Negenborn

geschrieben 08. September 2009 - 23:03

Beitrag anzeigenZitat (mibtng: 08.09.2009, 23:16)

Die Frage ist doch, wieso man überhaupt eine Klasse init braucht? Vor allem die wird ja vermutlich eh nur einmal mit $init instanziert...

Warum muss diese können was die Klasse db und die Klasse login kann?


Ja stimmt eigentlich weiß ich auch nicht so wirklich wozu ich die unbedingt haben möchte. Einzeln ist es eigentlich auch viel sinvoller.

Aber alternativ könnte ich doch auch die Interfaces benutzen, der einzige nachteil wäre halt das eine Methode nicht doppelt vorkommen darf aber das könnte man ja auch mit den neu einführten namespaces lösen, nur würde dann php 5.3 benötigt.

Also vielen Dank für die Antworten ich werde es jetzt getrennt machen.
0

#7 Mitglied ist offline   [Elite-|-Killer] 

  • Gruppe: aktive Mitglieder
  • Beiträge: 762
  • Beigetreten: 02. Oktober 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Passau

geschrieben 08. September 2009 - 23:03

Achja, weil es mir gerade einfällt:

Mit etwas Kenntnis der Reflection-API und der Erweiterung Runkit könnte man sich Mehrfachvererbung allerdings selbst ganz leicht nachbauen (Ist allerdings vermutlich ziemlich Ressourcenfressend).

Also nach dem Motto:

function extend() { ... }
class Init { ... }
class Login { ... }
class DB { ... }

Und als Beispielaufruf:
extend('Init', 'Login', 'DB');

Dieser Beitrag wurde von [Elite-|-Killer] bearbeitet: 08. September 2009 - 23:06

0

#8 Mitglied ist offline   Skiller 

  • Gruppe: aktive Mitglieder
  • Beiträge: 164
  • Beigetreten: 06. September 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Negenborn

geschrieben 08. September 2009 - 23:18

Nette Idee, aber mit Runkit habe ich mich noch nicht so stark beschäftigt.

Ich denke das sinvollste wird es sein auf "normalen weg" zu programmieren, vor allem bleibt das projekt dann für andere mitstreiter offener.
0

#9 Mitglied ist offline   [Elite-|-Killer] 

  • Gruppe: aktive Mitglieder
  • Beiträge: 762
  • Beigetreten: 02. Oktober 05
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Passau

geschrieben 09. September 2009 - 02:00

Wie ich gerade festgestellt habe lässt sich das ganze auch ohne die Runkit Extension lösen und das eigentlich sogar ziemlich performant (Caching der erweiterten Klasse) :rolleyes:
Constants, Properties und Methods lassen sich alle per Reflection auslesen oder aus der entsprechenden Datei extrahieren. Das Ganze kann man dann unter Beachtung von Vaterklassen und Interfaces zu einer neuen Klasse schön zusammensetzen.
Mal sehen, vielleicht implementiere ich es am Wochenende mal, denn das könnte für manche Probleme doch ganz praktisch und elegant sein.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0