Tomas: Klassen sind ja toll, aber wie gehts weiter?

Hallo meine Lieben^^

Schon seit einger Zeit versuche ich mir mehr Wissen über das OOP in PHP anzueignen. Ich denke ich habe das Prinzip verstanden und kann selbstständige Klassen usw. schreiben.

Was ich aber einfach nicht verstehen kann ist, wie diese Klassen nun zusammenarbeiten können?

Selbst wenn ich alles in sinnvolle Klassen geteilt habe, muss ich doch immer sagen: Klasse A mach das, den rückgabewert gebe ich an Klasse B. Aber mir scheint, da wird der code letztendlich genauso einfach abgearbeitet, als würde ich ohne Klassen arbeiten.

Das Problem ist, ich kenne kein Beispiel im Web, das mal mehrere Klassen zusammenarbeiten lässt. Aber ich kapier einfach nicht, wie das funktioniert, damit ich durch OOP auch einen Vorteil erhalte.

Sorry, das "Problem" ist nicht wirklich gut beschrieben, aber vielleicht findet sich hier ja doch ein kleiner Geistesblitz, der mir mal auf die Sprünge hilft.

Liebe Grüße, Tomas.

  1. Hi,

    Was ich aber einfach nicht verstehen kann ist, wie diese Klassen nun zusammenarbeiten können?

    Lesetipp: Design Patterns

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      Lesetipp: Design Patterns

      Danke dir, das werde ich mir einmal ansehen :)

      Liebe Grüße-

  2. echo $begrüßung;

    Was ich aber einfach nicht verstehen kann ist, wie diese Klassen nun zusammenarbeiten können?
    Selbst wenn ich alles in sinnvolle Klassen geteilt habe, muss ich doch immer sagen: Klasse A mach das, den rückgabewert gebe ich an Klasse B. Aber mir scheint, da wird der code letztendlich genauso einfach abgearbeitet, als würde ich ohne Klassen arbeiten.

    Es kommt letztlich auf das Aufwand-Nutzen-Verhältnis an. Wenn du ein 0815-PHP-Script objektorientiert zu schreiben versuchst, wirst du den Sinn des Mehraufwands vielleicht nicht erkennen. Wenn du jedoch größere Projekte aufsetzt, kann sich das ändern. Wenn beispielsweise grundlegende Funktionalität an verschiedenen Stellen benötigt wird, dort aber noch spezialisiert werden muss, dann bietet sich eine Grundklasse an, die man durch Beerbung spezialisiert.

    Es muss ja auch nicht unbedingt immer eine vollständig objektorientierte Lösung aufgesetzt werden. Es hilft ja oft schon, wenn man in einem Objekt Daten über Eigenschaften bündeln kann, die sonst irgendwo herumlägen, und gegen ein Überschreiben durch andere Programmteile nicht geschützt sind, oder sie innerhalb von Funktionen mehr oder weniger umständlich bekannt gemacht werden müssen (global/$GLOBALS[...]).

    Das Problem ist, ich kenne kein Beispiel im Web, das mal mehrere Klassen zusammenarbeiten lässt. Aber ich kapier einfach nicht, wie das funktioniert, damit ich durch OOP auch einen Vorteil erhalte.

    Es gibt genügend objektorientierte PHP-Frameworks. Eins davon ist das Zend Framework.

    echo "$verabschiedung $name";

    1. Hallo,

      Es kommt letztlich auf das Aufwand-Nutzen-Verhältnis an. Wenn du ein 0815-PHP-Script objektorientiert zu schreiben versuchst, wirst du den Sinn des Mehraufwands vielleicht nicht erkennen. Wenn du jedoch größere Projekte aufsetzt, kann sich das ändern. Wenn beispielsweise grundlegende Funktionalität an verschiedenen Stellen benötigt wird, dort aber noch spezialisiert werden muss, dann bietet sich eine Grundklasse an, die man durch Beerbung spezialisiert.

      Das denke ich mir. Aber ich sehe z.B. einen funktionalen Vorteil wenn ich eine Datenbank-Klasse schreibe, auch wenn diese letztendlich nicht sehr viel mehr kann als die normalen DB-Funktionen selbst auch.

      Das Prinzip der Vererbung habe ich verstanden, aber ich meine, wenn ich alles ineinander vererbe bringt mir das auch nichts, oder liegt hier ein Denkfehler?

      Es muss ja auch nicht unbedingt immer eine vollständig objektorientierte Lösung aufgesetzt werden. [..]

      Das gelingt mir ja schon. Vielleicht sind meine Vorhaben aber tatsächlich weniger komplex und damit weniger für OOP "geeignet" als ich meine.

      Es gibt genügend objektorientierte PHP-Frameworks. Eins davon ist das Zend Framework.

      Danke, das werde ich mir mal genauer ansehen. Ich fürchte nur - daher habe ich auch von PEAR abstand gehalten, dass das ganze schon etwas zu komplex sein wird, als dass ich mir damit mehr verständnis erarbeiten kann.

      Liebe Grüße, Tomas.

      1. echo $begrüßung;

        Aber ich sehe z.B. einen funktionalen Vorteil wenn ich eine Datenbank-Klasse schreibe, auch wenn diese letztendlich nicht sehr viel mehr kann als die normalen DB-Funktionen selbst auch.

        Die Datenbankklasse ist ein recht typisches Beispiel, wenn man mit OOP anfängt. Doch wenn sie wirklich nicht viel mahr kann als die bisherigen Funktionen zu kapseln, bist du mit einer bereits existierenden Klasse (mysqli oder PDO) schneller am Ziel. Vielleicht solltest du dann dein Ziel ändern. Beispielsweise könntest du sämtliches Datenquellenhandling aus der Geschäftslogik verbannen, so dass am Ende ein einzelner Funktions- oder Methodenaufruf bleibt, der dir deine Daten fix und fertig abgefragt (bzw. dies veranlasst) und gebündelt übergibt.[1]

        Das Prinzip der Vererbung habe ich verstanden, aber ich meine, wenn ich alles ineinander vererbe bringt mir das auch nichts, oder liegt hier ein Denkfehler?

        Letztlich sollte die Kapselung in Klassen schon ein sinnvolles Gebilde ergeben. Alles in eine große Klasse zu stecken ist am Ende auch nicht besser als ein großes flaches Script.
        Bleiben wir beim Beispiel Datenbank. Eine Basisklasse könnte beispielsweise generell mit einer Tabelle umgehen. Sie kann Daten abfragen, hinzufügen, ändern und löschen, beherrscht also das RUDI-Prinzip. Sie weiß aber nichts spezielles von der Tabelle, mit der sie später mal zu tun haben wird, also die Namen der Felder und welches der Primärschlüssel ist. Diese Spezialisierung kommt dann in eine erbende Klasse. Und davon gibt es dann soviele wie du Tabellen hast.

        Diese Tabellenbasisklasse muss auch nicht das komplette Datenbankhandling implementiert haben, sondern nur den Teil, der die Statements zusammensetzt. Das eigentliche Kommunizieren mit der Datenbank übernimmt eine andere Klasse, die mit der Tabellenklasse nicht weiter verwandt sein muss. Diese Datenbankklasse hat nur Funktionen zum Abarbeiten von übergebenen Statements. Man kann sie auch etwas komfortabler gestalten, so dass sie Statements mit Platzhaltern und getrennt davon die Werte übernimmt, und die Werte datenbankspezifisch maskiert in das Statement einfügt (falls man nicht sowieso Prepared Statements der DB-API nutzen kann).

        ... Zend Framework.

        Danke, das werde ich mir mal genauer ansehen. Ich fürchte nur - daher habe ich auch von PEAR abstand gehalten, dass das ganze schon etwas zu komplex sein wird, als dass ich mir damit mehr verständnis erarbeiten kann.

        Nun, du musst ja nicht gleich alles zu verstehen versuchen. Fang mit einem Tutorial an und achte dabei immer mit darauf, welche Funktionalitäten auf welche Weise in bestimmte Klassen aufgeteilt worden sind.

        PEA ist mehr oder weniger eine lose Klassensammlung. Das Zend Framework will eine komplette Rundrum-Unterstützung bieten, ist aber auch so gestaltet, dass man einige Teile komplett ignorieren kann, wenn man sie nicht braucht oder was anderes stattdessen verwenden will.

        [1] Das ist bei großen Datenmengen nicht besonders effektiv, doch auch hier gibt es unter PHP weitergehende Möglichkeiten. Man kann ein simuliertes Array zurückgeben, das erst beim Zugriff die jeweiligen Werte abholt. Dies kann man mit der Funktionalität der Standard PHP Library implementieren.

        echo "$verabschiedung $name";

        1. Hallo,

          Doch wenn sie wirklich nicht viel mahr kann als die bisherigen Funktionen zu kapseln, bist du mit einer bereits existierenden Klasse (mysqli oder PDO) schneller am Ziel.

          Das habe ich mir auch gedacht, als ich Klassen und Onjekte auf diese Weise kennen gelernt habe. Allerdings bin ich nun weiter und Versuche die Schnittstellen zur Klasse auch so zu definieren, dass im Hintergrund eine beliebige SQL-Datenbank stehen könnte.

          Vielleicht solltest du dann dein Ziel ändern. Beispielsweise könntest du sämtliches Datenquellenhandling aus der Geschäftslogik verbannen, so dass am Ende ein einzelner Funktions- oder Methodenaufruf bleibt, der dir deine Daten fix und fertig abgefragt (bzw. dies veranlasst) und gebündelt übergibt.[1]

          Ich glaube so kompakt benötige ich das noch nicht, aber ich werde es mal im Hinterkopf behalten :)

          [...]

          Das ist eine Menge Stoff, aber ich verstehe schon, was du mir damit sagen willst. (juhu;) ).

          PEA ist mehr oder weniger eine lose Klassensammlung. Das Zend Framework will eine komplette Rundrum-Unterstützung bieten, ist aber auch so gestaltet, dass man einige Teile komplett ignorieren kann, wenn man sie nicht braucht oder was anderes stattdessen verwenden will.

          Wenn das so möglich ist, ist es schon ein guter Anreiz, sich das mal genauer anzusehen!

          Vielen Dank, Tomas.

  3. Moin!

    Schon seit einger Zeit versuche ich mir mehr Wissen über das OOP in PHP anzueignen. Ich denke ich habe das Prinzip verstanden und kann selbstständige Klassen usw. schreiben.

    Was ich aber einfach nicht verstehen kann ist, wie diese Klassen nun zusammenarbeiten können?

    Selbst wenn ich alles in sinnvolle Klassen geteilt habe, muss ich doch immer sagen: Klasse A mach das, den rückgabewert gebe ich an Klasse B. Aber mir scheint, da wird der code letztendlich genauso einfach abgearbeitet, als würde ich ohne Klassen arbeiten.

    Bei mikroskopischer Betrachtung hast du natürlich recht: Code wird einfach abgearbeitet.

    Möglich aber, dass du bisher nur einen kleinen Teil der Vorteile von OOP entdeckt hast.

    Ziemlich typisch für OOP ist nach meiner Erfahrung, dass es zwei Arten von Klassen bzw. Objekten gibt: Die eine Sorte beschäftigt sich ausschließlich mit Interna. Die andere Sorte hat Kontakt zur Außenwelt in irgendeiner Form - sei es, weil eine Datenbank abgefragt wird, eine Datei zu lesen oder zu schreiben ist, eine Mail zu verschicken etc.

    Und logischerweise können die Klassen ihre internen Aufgaben nicht erledigen, ohne über die externen Klassen Zugriff auf diese externen Ressourcen zu erhalten. Also übergibt man der internen Klasse eine Instanz der externen Klasse und erlaubt ihr dadurch, nach außen zu wirken.

    Dadurch ergibt sich der Vorteil, dass man die internen Mechanismen der externen Klasse grundsätzlich frei verändern kann, bzw. dass man sogar komplett unterschiedliche Klassen, die das gleiche Interface implementieren, nutzen kann, um z.B. unterschiedliche Datenbanken einzubinden.

    Der grundsätzliche Kern hierbei ist: Objekte werden in Objekte übergeben und erzeugen auch wieder Objekte.

    Ohne eine äußere Schicht an prozeduralem Code kommt man allerdings nicht aus, denn irgendein Code muß ja die ganze Objektgeschichte in Gang setzen.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hallo,

      Möglich aber, dass du bisher nur einen kleinen Teil der Vorteile von OOP entdeckt hast.

      Nicht nur möglich, sondern sehr wahrscheinlich.

      ... Die andere Sorte hat Kontakt zur Außenwelt in irgendeiner Form - sei es, weil eine Datenbank abgefragt wird, eine Datei zu lesen oder zu schreiben ist, eine Mail zu verschicken etc.

      Ich glaube das ist die Art von Klassen mit der ich noch nicht zurechtkomme.

      Und logischerweise können die Klassen ihre internen Aufgaben nicht erledigen, ohne über die externen Klassen Zugriff auf diese externen Ressourcen zu erhalten. Also übergibt man der internen Klasse eine Instanz der externen Klasse und erlaubt ihr dadurch, nach außen zu wirken.

      Wenn ich fragen darf ob hier dieses beispiel richtig ist: Angenommen eine Klasse, die eine Statistik berechnet. Eine weitere Klasse angenommen, die für Datenbankarbeiten zuständig ist. Dann müss ich der Statistik-Klasse eine Datenbank-Instanz übergeben, damit die Statistik-Klasse richtig arbeiten kann?
      Habe ichd as so richtig verstanden?

      Dadurch ergibt sich der Vorteil, dass man die internen Mechanismen der externen Klasse grundsätzlich frei verändern kann, bzw. dass man sogar komplett unterschiedliche Klassen, die das gleiche Interface implementieren, nutzen kann, um z.B. unterschiedliche Datenbanken einzubinden.

      Das wiederum war mir schon bekannt, das nennt man ja die Polymorphie, sofern das richtig ist ;)

      Der grundsätzliche Kern hierbei ist: Objekte werden in Objekte übergeben und erzeugen auch wieder Objekte.

      Diesen Punkt wiederum verstehe ich nicht, was genau bedeutet Objekte erzeugten wieder Objekte?

      Ohne eine äußere Schicht an prozeduralem Code kommt man allerdings nicht aus, denn irgendein Code muß ja die ganze Objektgeschichte in Gang setzen.

      Ich meine soweit habe ich es schon verstanden. Nur habe ich bisher lediglich erfahrung mit der Art von Klassen, die sich nur mit Interna beschäftigen, wie du so schön sagst.

      Vielen Dank und liebe Grüße, Tomas.