Funktionen vs Klassen
Powl
- php
1 MiSo3 Sven Rautenberg2 fanelf.de0 Powl0 Christian Seiler0 Powl
Hallo,
eingangs erwähnt, daß ich mich mit PHP bisher eigentlich nur eigenständig beschäftigt habe, also von Datenbankanbindung bzw. MySQL komplett losgelöst. Und meine PHP Kenntnisse sind leider auch (noch) recht begrenzt.
Ich habe nun ein grundsätzliches Verständnisproblem, wann man Funkionen und wann sinnvoller Klassen einsetzen sollte.
Objektbezogenes Programmieren habe ich als Stichwort verfolgt, nur ist doch eine Variable in PHP auch ein Objekt, oder? Ob ich dieses nun mittels einer klassischen Funktion oder einer Konstrukorfunktion in einer Klasse bearbeite, macht für mich keinen großen, offensichtlichen Unterschied.
_Der_ Vorteil, den ich erkennen kann liegt im wesentliche darin mittels einer Klasse ein neues Objekt zu schaffen. Das macht es somit (scheinbar?) einfacher mit Variablen respektive deren Werten zu arbeiten, da diese nicht übergeben werden müssen. Wobei return($var); in einer Funktion irgendwie so aufwendig auch nicht erscheint.
In dem Buch von S. Münz gibt es zwei Beispiele, einmal dieses wo mit Funktionen gearbeitet wird, und dazu ein analoges Beispiel, wo eigentlich das gleiche mit Klassen realisiert wird.
Ich sehe in diesem Fall keine Vorteile von Klassen im Vergleich zu der auf Funktionen basierenden Variante. Der Codeumfang ist nicht nennenswert unterschiedlich.
Gibt es speziell im Bezug auf PHP eine Art Regel nach der man entscheiden kann, ob eine Klasse oder eine Funktion sinnvoller wäre?
Oder mal anders gefragt, wolltet ihr ein solches Template Beispiel realisieren, welcher der beiden Lösungen (Funktion/Klasse) würdet ihr favoritisieren und _warum_?
Würde mich freuen wenn mir das jemand begreiflich machen könnte.
netten Tag
^da Powl
Wenn du mit unaufwendigen Sachen arbeitest, dann machts wenig Sinn dafür extra Klassen anzulegen.
Wenn du aber zum Beipsiel mit Mehreren MySQL-Datenbanken gleichzeitig arbeitest, dann ists "bequemer" ne Klasse für die Funktionsaufrufe zu haben. Weiterhin hast du durch Klassen den Vorteil von der Arbeit mit Objekten. Wenn du keine Klasse hast, hast du auch kein Objekt mit Eigenschaften. Die Konstruktoren brauchst du nicht zwingend, das ist wahr. Was ein Konstruktor erledigt, kannst du von einer normalen Funktion erledigen lassen. Es ist aber wenn du mich fragst bequemer, wenn eine Funktion sich selbstständig die Parameter aus den Eigenschaften des entsprechenden Objekts holt.
Ne Faustregel für den einsatz gibts natürlich nicht, höchstens einige Sachen, die anders nicht oder schwer machbar sind. Beispiel wäre z.B. eine Schlange mit Elementen mit Vor- und Zurück-Zeigern.
mfg
Micha
Moin!
Oder mal anders gefragt, wolltet ihr ein solches Template Beispiel realisieren, welcher der beiden Lösungen (Funktion/Klasse) würdet ihr favoritisieren und _warum_?
Meine Antwort ist da recht simpel: Ich nehmen den Klassenansatz, weil ich die existierende Template-Klasse einsetze. Ich verfüge über keine Template-Engine, die funktionsbasiert ist, also habe ich da gar keine Wahl.
Noch ein Punkt ist aus "Anwendersicht" beim Unterschied zwischen Funktionen und Klassen beachtenswert:
Eine Klasse hat einen Namen, deren instanziierte Objekte sind simple PHP-Variablen, deren Namen man sogar frei benennen kann. Damit erreicht man, dass lediglich der Klassenname eindeutig sein muß, alles andere, insbesondere die Methodennamen der Klasse, stecken dadurch in einem eigenen Namensraum.
Ich muß mich also als die Klasse anwendender Programmierer nur drum kümmern, andere Klassen nicht identisch zu benennen. Aber ich kann problemlos in der Templateklasse eine Methode "check" haben, und in der Mailadressenklasse ebenfalls eine Methode "check".
Hätte ich nur Funktionen zur Verfügung, käme es hier zum Konflikt, und ich müßte mindestens eine der zwei Funktionen umbenennen.
Nicht betrachtet wird hierbei, dass Objektorientiertes Programmieren OOP als Herangehensweise an ein Problem oft gewisse Lösungsmöglichkeiten erlaubt, die technisch einfach und verständlich sind. Selbstverständlich kann man die Probleme auch nur mit Funktionen lösen (die CPU kennt keine Objekte oder Klassen, die kriegt nur Maschinencode - also wird jede OOP sowieso auf den niedrigsten Level übersetzt, den es gibt), es wird aber eventuell komplizierter oder weniger verständlich, oder alle Codeteile werden dadurch ineinander verwoben und schlecht wartbar.
- Sven Rautenberg
objektorientierung bedeutet als erstes, einen zusammmenhang zu kapseln. dies erleichtert den überblick über diesen "kleinen" zusammenhang, ohne zu wissen, in welchem "großen" zusammenhang diese kapselung verwendet wird. moderne vorgehensweisen sind anders nicht mehr denkbar.
kapselung hält attribute (ausprägungen) und methoden (fähigkeiten) in einem überschaubaren und geschlossenen zusammenhang. somit ist nach außen quasi eine "lebende" black-box (instanz) am großen zusammenhang beteiligt.
wird keine "lebende" black-box benötigt, reicht es aus, nur die methoden zu kapseln. dies ist der algorithmus, wie das datenargument behandelt wird. typische beispiele sind die math und i/o funktionen. hier liegt die verantwortung mit der versorgung der richtigen daten außerhalb der funktion.
stell dir mal die funktion gibAlter(mensch[name]) vor. hier hättest du z.b. in einem separaten array mensch[name] alle attribute als reine daten vorliegen, welche du dieser funktion übergibst. die funktion würde nun aus dem geburtsdatum das alter ermitteln. du hättest dann zwar die berechnung des alters gekapselt, aber nicht sicher gestellt, daß du die dazu richtigen daten übergibst. die fehlersuche gestaltet sich in solchen fällen meist recht schwierig, da du beides koordinieren mußt, besonders dann, wenn sich die struktur des arrays mensch mal ändert.
verbindest du aber die berechnung des alters direkt mit dem menschen, hast du die daten und die auf einen kleinen überschaubaren teil gekapselt. es ist sicher einfacher, da dich die datenstruktur von mensch außerhalb der kapselung nicht interessiert. statt dessen kommunizierst du einfach nur mir dem objekt.
Hallo,
vielen Dank für die Antworten. Das hilft mir schon weiter.
Wenn ich das kurz zusammenfassen müßte, haben Klassen die Vorteile
Für die beiden Beispiele macht das wahrscheinlich nicht wirklich etwas aus, aber wenn es um größere Projekte insbesondere unter Benutzung verschiedener Datenbanken geht, ist OOP mittels Klassen überschaubarer, leichter wartbar und universeller einsetzbar.
Ist das im Wesentlichen so richtig?
netten Tag
^da Powl
Hallo Powl,
Ist das im Wesentlichen so richtig?
Doch, durchaus, das trifft es in meinen Augen schon ganz gut. Sicher findet man noch ein paar andere Punkte oder auch Einschränkungen der obigen Punkte (man kann über die Vor- und Nachteile von OOP ganze Bücher schreien ;-)), aber im großen und ganzen würde ich dem zustimmen.
Viele Grüße,
Christian
Hallo,
fein, danke Dir.
netten Tag
^da Powl