© saicle/Shutterstock.com
Neue Möglichkeiten mit dem Exar-Framework entdecken

Aspektorientierung mit PHP


Die aspektorientierte Programmierung führt in der PHP-Welt bisher ein Nischendasein. Deren Verwendung in anderen Programmiersprachen zeigt, dass die AOP bei geschicktem Einsatz die Wiederverwendbarkeit des Programmcodes deutlich steigern kann. Dieser Artikel zeigt die Möglichkeiten der Aspektorientierung für PHP-Anwendungen auf.

Ich bin ein Softwareentwickler. Ein leidenschaftlicher. Die Sprache meiner Wahl ist Java, meistens. Aber hin und wieder schreibe ich PHP-Anwendungen.

Wenn man mit mehreren Programmiersprachen parallel zu tun hat, lernt man in ihrer Gegenüberstellung sehr schnell Stärken und Schwächen der jeweiligen Sprache kennen. Beim Vergleich mit PHP fiel mir zuerst eine Stärke von Java besonders auf – die Möglichkeit der annotationsbasierten Entwicklung.

Von Java lernen

Wer mit JBoss Seam, Spring oder EJB gearbeitet hat, kennt die vielen Vorteile der annotationsbasierten Programmierung. Mithilfe von Annotationen werden Metainformationen in den Quelltext des Programms eingebunden und können vom Compiler, aber auch zur Laufzeit, ausgewertet werden, um Funktionalität der Anwendung zu beeinflussen. Annotationen bedienen in Java verschiedene Spezifikationen (APIs). So lassen sich beispielsweise mit JAXB Objektzustände sehr schnell und elegant in XML-Strukturen überführen, mit JAX- RS RESTful Web Services umsetzen oder mit JPA die Objekte auf eine relationale Datenbank übertragen. Dies alles sind Technologien, die es erlauben, innerhalb kürzester Zeit vollwertige Applikationen zu schreiben. Dabei bleibt der Quelltext sauber, denn die technischen Aspekte (wie z. B. die Bereitstellung einer Ressource als RESTful Web Service) werden durch externe Libraries umgesetzt und lediglich über die Annotationen mit dem Anwendungscode verknüpft.

Besonders interessant ist das in EJB 3.0 eingeführte „Standard Interceptor Model“. Mithilfe von Interceptoren kann man die Ausführung von Methoden abfangen und somit das Programmverhalten beeinflussen. Man spricht in diesem Zusammenhang auch von der aspektorientierten Programmierung, kurz AOP. Dies ist ein Programmierparadigma, bei dem Teile der Anwendung, die nicht unmittelbar zur Kernfunktionalität gehören, separat implementiert und erst zur Laufzeit in das eigentliche Programm eingefügt werden. Am Ende bleibt ein klar strukturierter, wartbarer Code, der mit Metainformationen versehen ist. Die Möglichkeit, dies annotationsbasiert zu machen, ist eine wesentliche Stärke von Java. Hier ist ein Beispiel einer annotierten Java-Klasse:

@Author(name = "John Doe") class MyClass { ... }

Wie nützlich wäre es doch, wenn man diese Technik auch auf PHP übertragen könnte. Doch dafür bietet PHP von Haus aus keine Möglichkeit. Im Jahr 2010 wurde ein entsprechender RFC abgelehnt [1]. Die Realisierung von Annotationen als Sprachelement von PHP war damit vom Tisch. Trotzdem war der Wunsch in der Entwicklergemeinde groß, Metainformationen zu Methoden und Klassen direkt am Code zu hinterlegen. So begann man, dafür die Docblocks „zweckzuentfremden“. Die Annotationen konnten als Kommentar definiert werden, ein Parser hat sie zur Laufzeit ausgewertet und der Anwendung zur Verfügung gestellt. Das ist zwar weniger komfortabel als die direkte Unterstützung durch die Sprache selbst, aber immerhin eröffnete diese Vorgehensweise ganz neue Perspektiven in der PHP-Entwicklung. Plötzlich ließen sich auch mit PHP ganze Frameworks umsetzen, deren Techniken man aus der Java-Welt kannte. So entstand z. B. Doctrine 2 – ein an Hibernate angelehntes ORM-Framework, dass die Spezifikation des Persistenz-API (JPA) nach PHP portiert.

Ein anderes bekanntes Framework TYPO3 Flow [2] geht da weiter und bietet AOP als Komplettpaket an. Damit kommt es der klassischen Vorstellung über die AOP am nächsten. Trotzdem stehen damit ein Paar wichtige Fragen im Raum:

  • Muss man unbedingt ein so großes und komplexes Framework einsetzen, wenn man eine überschaubare Applikation implementieren möchte?

  • Wie lassen sich AOP-Features in der eigenen PHP-Anwendung verwenden, wenn die Entscheidung über das zugrunde liegende Framework bereits feststeht? Kann man AOP-Funktionalität nachträglich in eine bestehende Anwendung einbauen?

Das alles macht deutlich, dass es einer neuen leichtgewichtigen Komponente bzw. Bibliothek für die Erfüllung dieser Anforderungen bedarf, die von den großen Frameworks nicht präzise genug adressiert werden.

Exar – ein AOP-Layer für PHP

Die Idee von einer kompakten AOP-Schicht für PHP war geboren. Diese Schicht sollte

  • AOP-Funktionalität über die annotationsbasierte Programmierung für PHP-Anwendungen in Anlehnung an Java zur Verfügung stellen.

  • ausschließlich auf der Standardfunktionalität von PHP aufbauen (d. h. keine zusätzlichen PHP-Erweiterungen voraussetzen).

  • möglichst wenige Abhängigkeiten zu Third-Party-Libraries aufweisen und keine besonderen Voraussetzungen an die Applikationsstruktur stellen.

  • einfach zu erweitern und in ihrer Verwendung optional sein, um die mit AOP einhergehenden Performanceverluste zu minimieren.

Als Grundlage braucht dieser AOP-Layer ein erweitertes Reflection-API, das Annotationen an PHP-Klassen und -Methoden verarbeiten kann. Die darauf aufbauende AOP-Komponente verarbeitet den annotierten Co...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang