Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
[OOP] Entwicklung von wiederverwendbaren Klassen [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[OOP] Entwicklung von wiederverwendbaren Klassen


 
compuboy1010
07-05-2004, 10:34 
 
Hallo,

hier eine Frage speziell zur Programmierung von wiederverwendbaren Klassen in PHP4.

Als ich vor einem Jahr mit meinem Projekt anfing habe ich zig Klassen geschrieben:

Klasse Page_News
Klasse Page_Company
Klasse Page_Shopping_Card
Klasse Page_Impressum

etc

Nun muss ich feststellen, dass ich mit diesen Klassen im meinem privaten Projekt Zuhause nix anfangen kann.
Also diese Klassen bekommen ein DB mysql Wrapper Objekt übergeben mit dem sie Queries ausführen können.

Jetzt frage ich mich was ich davon habe. Jede Webseite hat die klassischen Rubriken News, Gallery, Impressum,etc. Da dachte ich mir das man da etwas wiederverwertbares schreiben sollte.

Was ich nun ich verstehe, wie kann man eine wiederverwertbare Klasse "News" schreiben, die auf eine DB zugreift.

Die Tabellenspalten und Layout sind doch bei alles DB Designern anders.

 
schmalle
07-05-2004, 10:39 
 
Welchen Sinn macht es für ein Impressum eine Klasse zu schreiben? Mir scheint, dass Du das Prinzip sowie den Sinn und Zweck OOP nicht ganz verstanden hast :rolleyes:

Wenn man seine Klassen clever durchdenkt, sind sie immer wiederverwendbar. Bestes Beispiel sind die im allgmeinen beliebten Template und SQL Klassen.

verschieb zu Brainstorming

 
Big Chief
07-05-2004, 10:41 
 
Indem du zum Beispiel in deiner Klasse eine setMethod bastelst, mit der du der Klasse ein Template (fürs Layout) und die Spaltennamen (für die Abfrage) übergibst.

 
compuboy1010
07-05-2004, 10:47 
 
Ich hatte die Klassen total durchdacht.
Habe zig UML Diagramme erstellt.

Also alles Klassen sind von einer Klasse Page abgeleitet, Diese wiederum erbt von der Template Klasse Smarty.

Die Klasse Impressum heißt Page_Impressum.
Ein Impressum hat ja immer die gleichen Attribute.
Name, Nachname, Steuernummer, etc.

Die Methoden in meiner Klasse holen sich mit queries die Info aus der DB.

 
schmalle
07-05-2004, 10:52 
 
Original geschrieben von compuboy1010
Ich hatte die Klassen total durchdacht. warum dann dieser Beitrag? :pEin Impressum hat ja immer die gleichen Attribute. aha :rolleyes: Und da reicht dann nicht eine Methode getImpressumData($this->project);

Dir ist schon klar, dass OOP bei "Übertreibung" des ganzen bös´langsam wird oder?

 
compuboy1010
07-05-2004, 10:58 
 
Hallo Schmalle,

ich sagte ich hatte die Klassen total durchdacht. Das war vor 2 Jahren. Da hatte ich so gut wie gar keine Erfahrung.

"Warum dieser Beitrag" ? Weil, ich nun die Konsequenzen der Unerfahrenheit spüre. :rolleyes:

Original geschrieben von schmalle
Und da reicht dann nicht eine Methode getImpressumData($this->project);


Könntest du mir das noch mal erläutern ?


Dir ist schon klar, dass OOP bei "Übertreibung" des ganzen bös´langsam wird oder? [/B]

Nein, war mir nicht klar.

 
schmalle
07-05-2004, 11:07 
 
Zum Bleistift. Ich habe ein Projekt mit x Seiten. Wenn ich jetzt für jede Seite eine eigene Klasse schreibe, ist das ganze doch total unflexibel ... Macht also keinen Sinn. Also bastel ich mir 2, 3 Klassen, die ich immer und üüberall verwende. Bei bedarf "klemme" ich noch eine weitere hinzu.

Dann habe z.B. eine CLasse pageContent. In dieser Klasse befindet sich die Methode getImpressumData(). Die Rufe ich auf, und übergebe den Return Wert an die Template Klasse -> fertig :p

 
compuboy1010
07-05-2004, 11:27 
 
Hallo Schmalle,

danke für deine Antwort.

Original geschrieben von schmalle
Dann habe z.B. eine Klasse PageContent. In dieser Klasse befindet sich die Methode getImpressumData(). Die Rufe ich auf, und übergebe den Return Wert an die Template Klasse -> fertig :p [/B]

AHA ....
:eek:

Aber wenn ich das mit der Klasse PageContent mache, dann habe ich ja wieder genau das gleiche Problem wie jetzt.

Wie flexibel ist die Klasse PageContent wenn mit Datenbanken gearbeitet wird ? Die Tabellen sind doch bei allen verschieden. Angenommen ich schreibe mir die Klasse gleich hier auf der Arbeit. Möchte die aber heute Abend auf CD brennen und bei meinem privaten Projekt Zuhause verwenden.

Ich arbeite z.B. mit der PEAR:DB Klasse um an mySQL ranzukommen.

Tut mir echt leid wenn ich dich vielleich mit für dich trivialen Dingen nerve. Aber könntest du mir mal kurz den Algorithmus schildern?

1 skript erzeugt PEAR DB Objekt ?
2 skript übergibt DB Objekt an Objekt PageContent ?

... wie weiter ?
Woher weiß die Methode getImpressum() in welcher Tabelle und welchen Spalten die Name, Steuernummer liegt?

Du glaubst nicht, wieviel mir das helfen würde wenn ich dieses !!Prinzip!! verstände. Dann würden sich ja die ganzen Klassen, Page_Impressum, Page_Contact, Page_Jobs, Page_Links,Page_Terms, Page_Partners,etc,etc erübrigen.

Hatte schon in diversen Foren gefragt, aber die haben mich immer missverstanden.

Danke

 
schmalle
07-05-2004, 11:39 
 
Du solltest mal ein Buch lesen :)

Bleistift:

wir haben 3 Klassen

pageClass extends TemplateClass extends sqlClass

Dann ein Array welches "irgendwo rumliegen", und die SQL Daten sowie Pfade etc. enthhält.

Dann der Aufruf $meineSeite = new pageClass($sql_und_pfad_array);

Ergebnis, du hast alle Klassen, die Du brauchst, auf einmal gestartet. Jetzt kannst Du in den Klassen mit $this, Classname::methbod oder parent::method arbeiten.

Definiere nicht zu oft VAR, sondern nurt für Objekte, die auch wirklich ständig brauchst. z.B. SQL VErbingskennung und Resource ID´s etc.

zum Thema PEAR fragst du hier allerdings den Falschen :)

 
compuboy1010
07-05-2004, 12:09 
 
Bleistift:

wir haben 3 Klassen

pageClass extends TemplateClass extends sqlClass

Dann ein Array welches "irgendwo rumliegen", und die SQL Daten sowie Pfade etc. enthhält.


Na ja so mache ich es ja schon.


Dann der Aufruf $meineSeite = new pageClass($sql_und_pfad_array);


OK


Ergebnis, du hast alle Klassen, die Du brauchst, auf einmal gestartet. Jetzt kannst Du in den Klassen mit $this, Classname::method oder parent::method arbeiten.


Mache ich auch schon teilweise.
Aber dann habe ich in der Klasse pageContent EINE MENGE Methoden, die ich in meiner privaten Homepage nicht brauche.

z.B.
getImpressum();
getOpenJobs();
etc

Und wenn ich die in eine Subklasse packe, dann bin ich bald wieder bei den 15 Klassen die ich nun schon habe. Das wären echt eine Menge Funktionen für die ContentPage Klasse, oder ?
[/QUOTE]


Definiere nicht zu oft VAR, sondern nur für Objekte, die auch wirklich ständig brauchst. z.B. SQL Ergebniskennung und Resource ID´s etc.


Du meinst Klassenvariablen? Also mehr mit lokalen Funktionsvariablen?


zum Thema PEAR fragst du hier allerdings den Falschen :)


OK, schade.


Ich habe aber noch eine Frage:

Weiß immer noch nicht woher die getImpressum() Methode(Fuktion)
weiß ich welche Tabelle sie gucken soll.

 
mrhappiness
07-05-2004, 12:14 
 
abgesehen davon, dass ich nicht weiß, welchen sinn es macht, sowas in ner datenbank zu speichern: entweder den tabellennamen als parameter mitgeben oder die tabelle mit dem impressum immer gleich nennen


was steht in der tabelle mit dem impressum eigentlich noch drin und wie is die aufgebaut?

 
schmalle
07-05-2004, 12:20 
 
Es spricht ja nichts dagegen 15 Klassen zu haben. Du darfst sie natürlich nicht alle auf einmal aufrufen :)

Das Ziel muss sein, mit möglichst wenig Code viel zu erreichen. Je weniger Du mit Variablen etc. rumhantierst, desto übersichtlicher wird das ganze.

Wenn Du z.B. Deine Impressum aufrufen willst, solltest Du dafür nicht mehr als 10 Zeilen Code brauchen. Der Rest sollte automatiert in den Klassen ablaufen.

 
compuboy1010
07-05-2004, 12:59 
 
Original geschrieben von mrhappiness
abgesehen davon, dass ich nicht weiß, welchen sinn es macht, sowas in ner datenbank zu speichern: entweder den tabellennamen als parameter mitgeben oder die tabelle mit dem impressum immer gleich nennen


was steht in der tabelle mit dem impressum eigentlich noch drin und wie is die aufgebaut?

OK,

Tabelle impressum existiert gerade nicht. Das ist Zufall..

Aber was spräche dagegen die Daten in einer DB zu speichern ?
Es sind doch Daten. (=> Datenbank).

Mal gucken, ob ich das richtig verstehen:

Da pageContent von db und template erbt:


function setTable($table)
{
$this->table = $table;
}

function getImpressum()
{
// hole die namen der spalten
// gebe einem array $impressum den idices die spaltennamen

$this->db->query("SELECT * FROM ".$this->table."");

// mit foreach das array mit den daten füllen
$this->assign('impressum', $impressum) // übergabe an template methode ?
}



Na ist das Teil einer wiederverwendbaren Klasse oder was ?!?!
:p

 
mukraker
07-05-2004, 12:59 
 
du solltes nicht versuchen dich nach dem DB designer zu richten, du solltest die richtlinien geben!

du kannst die spalten tabellennamen per parameter an deine methode geben $foo -> set_cols(array('id'=>'buu', 'test'=>'loo', user_id' => 'doo'))

wird dann aber doch etwas schwachsinning, da du einfacher die DB tabellen über ne Install funktion deines scriptes erstellen lassen sollten sprich:

will du
page.class.php (methode -> impressum) haben, check vorher ob die tabelle existiert ansonsten wird die angelegt -> geh in richung modulen

 
schmalle
07-05-2004, 13:15 
 
Original geschrieben von compuboy1010
Na ist das Teil einer wiederverwendbaren Klasse oder was ?!?!
:p Ist es, ... aber nicht durchdacht :p

es müsste so aussehen:

// irgendwo auf Seite

$pageClass = new pageClass($array_etc);

$impressum = $pageClass->GetImpressumData();

// in der class

function getImpressumData() {

$this->query(" select Bla bla bla );
$arrar = $this->fetchData($this->resourceID);
return $array;

}

// irgendwo anders

echo $pageClass->parseData($impressum);

 
compuboy1010
07-05-2004, 13:38 
 
Original geschrieben von schmalle
Ist es, ... aber nicht durchdacht :p

es müsste so aussehen:

// irgendwo auf Seite

$pageClass = new pageClass($array_etc);

$impressum = $pageClass->GetImpressumData();

// in der class

function getImpressumData() {

$this->query(" select Bla bla bla );
$arrar = $this->fetchData($this->resourceID);
return $array;

}

// irgendwo anders

echo $pageClass->parseData($impressum);



Aber was soll $impressum irgendwo auf der Seite ?
return $array braucht man doch garnicht.

Die Page Klasse erbt doch von template, also würde
$this->assign('array', $array); in getImpressum()
doch reichen oder ?

assign(); ist eine Funktion der Klasse Smarty

Und wo kommt der resourceID her ?

Bin mir nicht sicher, aber sollte man den $slq String nicht mit an getImpressum($sql) über geben ? Was ist wenn imressum aus mehreren seiten besteht ? Impressum wahrscheinlich nicht aber sagen wir die Seite Links ?

 
schmalle
07-05-2004, 13:56 
 
:) zunächst hab ich nen Fehler drin. Es hätte parent::query() heissen müssen.Aber was soll $impressum irgendwo auf der Seite ? Was wohl? Da steht der Inhalt Deines Impressums drin, und den willst Du doch ausgeben oder? :)

$this->resourceID wird durch die methode query() erzeugt / neu befüllt.

Ich gebe Dir noch ein Beispiel. So sieht bei mir der Code aus, der ein komplettes CRM auswirft. ( in diesem Fall die Mitarbeiterliste ):<?php

### Allgemeine Startoptionen
### Passiert alles in der CFG, die im folgenden initialisiert wird :-)

include "../../inc/cfg.php";



### User Klasse

include $_PATH."/inc/user.php";
$user = new user();

### SQL Limit initialisieren

if(!isset($_SESSION['files'][$_SESSION['activeKennung']]['forms']['limit'])) {

$_SESSION['files'][$_SESSION['activeKennung']]['forms']['limit'] = 0;

} // <-- Noch kein SQL Limit vergeben

### Alle Mitarbeiter

$alle = $user->getMitarbeiter();
$alle = count($alle);

### Anzuzeigende Mitarbeiter

$daten = $user->getMitarbeiterList($_SESSION['files'][$_SESSION['activeKennung']]['forms']['limit'], 'user_nachname','asc');
$anzuzeigende = count($daten);

### Kann Seitenzähler vorhanden sein?

if($alle > $anzuzeigende) {

$zaehler = $trex->seitenZaehler($alle, $anzuzeigende, $_SESSION['files'][$_SESSION['activeKennung']]['forms']['limit']);
$zaehler = $trex->parseFile($zaehler);

} // <-- mehr datensätze vorhanden, als angezeigt werden

else {

$zaehler = "";

} // <-- Counter nicht erforderlich

### ggf. Daten anpassen ###

for($i=0; $i<$anzuzeigende; $i++) {

if($daten[$i]['parentV'] == "") { $daten[$i]['parentV'] = "<i>freigestellt</i>"; }

} // <-- daten durchlaufen

### Erzeugen der wichtigsten Template Vars
### _CONTENT und _MENUE müssen immer vorhanden sein

$code = $trex->readFileArray($_PATH."/tpl/mitarbeiter/uebersicht.htm");

$_CONTENT = $trex->parseFile($code);

$_MENU = $trex->parseMenue();

include $_PATH."/files/panel.php";

?>Ausgabe im Anhang

 
compuboy1010
07-05-2004, 14:07 
 
Hallo Schmalle,

meinst du ich könnte mal deine getMitarbeiter() Funktion sehen ?

Warum brauchst du das "parent". Du willst doch auf die Funktion des Objekts zugreifen und nicht das der Klasse.

query wird doch vererbt an page ...

:confused:

 
schmalle
07-05-2004, 14:16 
 
Original geschrieben von compuboy1010
meinst du ich könnte mal deine getMitarbeiter() Funktion sehen ? Hmm, ausgerechnet da hab ich geschummelt :) Die Funktion dient eigentlich einem anderen Zweck ... aber naja: ### Funktion zum Einlesen aller Mitarbeiter in ein Array.
### Ist bereits für <select> optimiert -> value & string

function getMItarbeiter() {

$this->trex->freeSelect(" select a.ID_USER,b.user_vorname,b.user_nachname from ".$this->trex->_prefix."_user a
left outer join ".$this->trex->_prefix."_user_daten b on a.ID_user = b.FKID_user
order by b.user_nachname
");
while($ro = mysql_fetch_assoc($this->trex->resID)) {
$mitarbeiter[] = array(
"value" => $ro['ID_user'],
"string" => $ro['user_nachname'].", ".$ro['user_vorname']
);

} // <-- while Mitarbeiter

return $mitarbeiter;

} // <-- getMitarbeiter()

 
compuboy1010
07-05-2004, 14:34 
 
Hallo Schmalle,

:eek:
Das ist das was ich meine. So hätte ich es auch gemacht.
Aber wie willst du die Klasse User nun in einem anderen Projekt verwenden. Dann musst du schon die gleiche Tabellenstruktur haben.

Sonst geht es nicht. So ist die Klasse User an dieses Projekt gebunden. Ich denke man müsste den $sql String an GetMitarbeiter übergeben.
Oder ?

 
schmalle
07-05-2004, 14:40 
 
Schon richtig, diese Klasse ist nicht dafür gedacht woanders verwendet zu werden. Die sql class aber schon. genauso wie die Template Class.
Denn bei diesem Projekt ging / geht es darum möglichst einfach neue Klassen zu integrieren, und nicht welche zu exportieren :)

Man könnte sie allerdings mit wenig Arbeit überall verwenden. Speziell eine User Klasse. Diese Tabellen haben fast immer die gleiche Struktur.

Zur Not legst du die SQL- Abfrage Strings als var in der klasee ab.

 
MoRtAlAn
07-05-2004, 15:15 
 
mh... wo wir bei dem thema sind...

ich könnte dann mal allgemein das Theme Generik vorschlagen :)

Wobei ich die Abstraktion einer klasse für impressum nicht verstehe, bzw. unsinnig finde ... ?!

aber vielleicht steige ich auch nur zu spät in diese Diskussion ein ?!

gruss

 
compuboy1010
07-05-2004, 15:42 
 
Schmalle,

unsere Unterhaltung hat mich echt weitergebracht.
Werde nicht mehr von Page jede Art von Seite abstrahieren.

Werde versuchen jede Klasse so zu schreiben dass ich vom aufrufenden Skript immer die $sql an die Funktion übergebe die was aus der DB holt.


Falls du noch da bist wünsche ich dir ein schönes Wochenende.

PS: Und natürlich allen anderen auch.

 
schmalle
07-05-2004, 15:48 
 
/me ist immer da. Ich gehöre zum Inventar :D Ebenso ein schönes WE.

 
compuboy1010
07-05-2004, 15:53 
 
Original geschrieben von MoRtAlAn

ich könnte dann mal allgemein das Theme Generik vorschlagen :)
aber vielleicht steige ich auch nur zu spät in diese Diskussion ein ?!


Hallo
Was ist Generik ?
Und wem möchtest du das vorschlagen ?

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:57 Uhr.