Feb 24 2009

Design Patterns: Dekorierer (Decorator) [vs. Vererbung]

Tag: AllgemeinPhoscur @ 18:10

Hab ja schon lange nichts mehr geschrieben, greife nun den Gedanken etwas über Design Patterns zu schreiben wieder auf.

Vorerst muss ich darauf hinweisen, dass ich kein Profi bin und hier meine subjektive Meinung vertrete. Dies wird also kein Eintrag wie aus dem Lehrbuch, ich versuche nur etwas auf meine Weise klar zu machen.

Einleitung der GoF: Favorisiere Zusammensetzung vor Vererbung (“Favor object composition over class inheritance”)

Vererbung sollte für jeden, der schon mal ein paar Klassen geschrieben hat, klar sein; Stichwort dazu ist (in PHP) “extends”. Zusammensetzung ist schon ein wenig schwieriger. Ich bin mir nicht mal sicher, ob das auch wirklich die perfekte Übersetzung für Composition ist. Die wichtigste Rolle spielt hier der Dekorierer. Weiterlesen “Design Patterns: Dekorierer (Decorator) [vs. Vererbung]“


Jan 25 2009

Vergleich PHP vs. Python

Tag: AllgemeinPhoscur @ 22:55

PHP und Python unterscheiden sich stark, daher wird dieser Vergleich vor allem auf die Verwendbarkeit für ein Browsergame abzielen.

Weiterlesen “Vergleich PHP vs. Python”


Dez 19 2008

Typen von Referenzen in PHP, Objekte löschen

Tag: Allgemein,EntwicklungPhoscur @ 14:59

Wieder was gelernt:

Es gibt in PHP zwei Typen von Objektreferenzen, auch wenn es keine Dokumentation dazu gibt (Wer eine findet bitte sagen..!).

Im Handbuch steht nur: Objekte werden immer als Referenz übergeben

Das stimmt natürlich, nur ist es nicht ganz so einfach. Das Problem fällt allerdings erst auf, wenn man Objekte kontrolliert zerstören will.

$obj = NULL; # (1)

Sollte ein Objekt zerstören, wie unset(). Doch was wenn man vorher

$obj2 = $obj;

gemacht hat? Plötzlich zerstört der erste Befehl (1) nichtmehr, er setzt nur die erste Variable auf NULL. Nun das selbe ein bischen verändert:

$obj2 = &$obj; # & für Referenz sollte eigentlich nicht nötig sein

(1) Führt nun dazu, dass beide Variablen NULL sind. Huch?

Diese Referenzen heißen entweder hard/soft oder echt/unecht, wie auch immer.


Dez 09 2008

PHP5 OOP Interfaces

Tag: EntwicklungPhoscur @ 23:31

Zu Deutsch “Schnittstellen”. Ich habe gemerkt, dass dieser Begriff sofort zu einer Fehlinterpretation führt, jedenfalls wars bei mir so. Ich hab diesen ganzen OOP Kram sowieso mind. zehn Mal lesen müssen, bis ich ihn annähernd gerafft hab. Einige Sachen sind mir immer noch unklar.

Die letzten Tage bin ich aber endlich darauf gekommen, wofür man diese Interfaces in PHP verwenden kann.

Zuerst einmal: Was ist so ein Interface?

Interfaces sind Klassen, die bestimmte Funktionen vorbestimmen. Die Funktionen bilden dann eine Schnittstelle, also eine bestimmte Möglichkeit von anderen Objekten angesprochen zu werden. Im Gegensatz zu anderen Klassen werden Schnittstellen implementiert (“implements”). Dadurch kann eine Klasse mehrere Schnittstellen haben, aber nur von einer einzigen normalen Klasse abstammen.

Man muss also nur die Schnittstelle kennen, um die Klasse verwenden zu können, die sie implementiert. Anders gesagt, man kann die Klasse so verwenden wie man die Schnittstelle als Klasse verwenden würde.

Sehr konkrete Beispiele liefert PHP selbst mit einigen Schnittstellen:

ArrayAcces: Die Objekte einer Klasse lassen sich wie Arrays ansprechen.
Iterator: Die Eigentschaften einer Objekts lassen sich iterieren, also auf eine bestimmte Weise durchlaufen.

Interfaces lassen sich aber auch noch weit abstrakter verwenden:

Ich schreibe ein Interface Datenbankverbindung, das ich aus praktischen Gründen dokumentiere. Ich weise nochmal darauf hin, dass dieses Interfaces keinen Programmcode enthält, es gibt nur Struktur vor.

Danach schreibe ich einen Dekorierer für meine mysqli Klasse und achte derweil auch etwas darauf, wie PDO aufgebaut ist, denn wahrscheinlich wird das eine weitere mögliche Datenbankverbindung (->Interfacename…) mysqli wird etwas zurechtgebogen und erweitert.

Resultat: Ich kann verschiedene Datenbankklassen nach ein paar Anpassungen verwenden. Ich benutze mysqli, weil es anscheinend die schnellste ist, was MySQL angeht. Letztlich verwende ich Typehints auf “Datanbankverbindung” und Autovervollständigung für das Interface, welches ich dokumentiert (phpDoc, Zend Studio) habe.

Ich hoffe, ich habe es etwas anschaulicher erklärt, als es das Handbuch tut. Ich erinnere nocheinmal daran, dass dies keineswegs einfach ist und ich selbst lange gebraucht habe es zu verstehen.


Sep 17 2008

OOP (Objekt orientierte Programmierung) PHP

Tag: EntwicklungPhoscur @ 14:03

Seit PHP4 ist es möglich PHP OO zu programmieren. Mit PHP5 wurde das stark ausgebaut, aber bisher habe ich noch kein OS (Open Source) Projekt gesehn, in dem das wirklich verwendet wird, dabei ist das doch nun schon älter… PHP geht schon in Richtung PHP6…

Ich habe mich sofort für OOP begeistern können, als ich es kennenlernte, auch wenn mir das nicht leichter fällt als prozedural (das ist der andere PHP Stil den quasi alle praktizieren) zu programmieren.

Yeah, PHP OOP ist supertoll, das muss ich ab jetzt umbedingt immer verwenden!
→ Nein! Man muss eindeutig abwiegen, ob man etwas OO programmiert, den bei PHP geht dabei Performance verloren, denn das kompliieren dauert länger.

Zum Preis von einem bischen Performance bekommt man dafür:

  • Übersichtlichkeit / Lesbarkeit
  • Darstellung von abstrakten und realen Dingen
  • Erweiterbarkeit
  • Wiederverwendbarkeit
  • Kapselung
  • und somit Effizienz

Und diese Liste ist noch lang nicht vollständig.

Das hat mich letztlich überzeugt. Ich bin dabei das Herzstück (“Phlame Engine”) für UGamela in OOP zu schreiben. Dabei werde ich zum Beispiel Planeten und Flotten in Models abbilden. Das Ergebnis gibt den Moddern, die hoffentlich angespornt sind und viele Ideen haben, einfache Möglichkeiten mit den Daten umzugehen, wahrscheinlich ohne selbst Ahnung von MySQL oder Sessions zu haben.

Ihr könnt ich somit schon auf die PHP OOP Pfeilchen “->” freuen xD