PHP-GTK, die Zweite

Aktuelle Entwicklungen bei PHP-GTK
Kommentare

Das Experiment, mit PHP Desktopapplikationen zu bauen, ist geglückt. PHP-GTK hat in den letzten Jahren stetigen Zuspruch erfahren und viele Probleme wurden damit gelöst. Dieser Artikel zeigt die Historie und den aktuellen Stand des Projekts.

Im August 2000 begann Andrei Zmievski aus Neugier damit herumzuexperimentieren, wie man das Widget-Toolkit GTK+ an PHP andocken könnte. Als Vorlage dienten das GTK-Perl und vor allem das PyGTK-Projekt, die beide schon etwas länger auf dem Mark waren und gezeigt hatten, dass solch ein Projekt wirklich funktionieren kann. Ein an den von PyGTK angelehnter Codegenerator wurde programmiert, der die für das PHP-Modul nötigen 100 Klassen und über 2.000 Methoden automatisch aus den GTK-Sourcen generieren konnte (auch wenn einiges per Hand nachbearbeitet werden musste). Anfang März 2001 wurde die erste Version namens „Genesis“ veröffentlicht – unstabil und von vielen belächelt. Im November 2002 wurde die für lange Zeit letzte Version 0.52 veröffentlicht. Version 1.0.0 vom Oktober 2003 enthielt außer ein paar Bugfixes nichts Neues – nur den Hinweis, „dass dies die wahrscheinlich letzte Version für PHP 4 sein wird. Die Entwicklung wird jetzt auf PHP-GTK 2 fokussiert, das nur auf PHP 5 laufen werden wird.“ Trotz der Ankündigung kam es erst mit der Veröffentlichung von PHP 5 im Juli 2004 zu einer Wiederbelebung der Entwicklung, da viele, von den objektorientierten Funktionen von PHP 5 begeistert, PHP-GTK 2 nachfragten. Anfang 2005 konnte man PHP-GTK 2 auf Computern der PHP-GTK-Entwickler in Aktion sehen, und im Mai hielt Andrei auf der International PHP Conference in Amsterdam den ersten Vortrag über PHP-GTK 2. Seitdem wurden viele Bugs gefixt, neue Funktionen implementiert und das Dokumentationssystem komplett umgekrempelt.

Aktueller Entwicklungsstand

Mitte April 2006 sind große Teile des APIs implementiert, der Codegenerator zeigt die folgende Abdeckung (Prozentsatz der implementierten zu allen GTK-Funktionen): ATK 85 Prozent, Pango 70 Prozent, GDK 87 Prozent und GTK 90 Prozent – insgesamt werden über 3.100 Konstrukte generiert. Die fehlenden Funktionen, Methoden, Konstruktoren und Eigenschaften sind solche, die man selten braucht – das ist der Grund dafür, dass es schon die ers-ten funktionierenden Projekte gibt. Die meisten Methoden funktionieren, einige benötigte, aber noch nicht umgesetzte Methoden kann man emulieren oder das Ziel auf anderem Weg erreichen. Das ist noch nicht so vollständig, wie es sein muss – die Richtung ist aber erkennbar, und das Ziel rückt immer näher.

Neuerungen in PHP-GTK 2

Die beiden auffälligsten Änderungen sind wohl, dass PHP-GTK 2 auf PHP 5 anstatt PHP 4 und mit GTK 2 statt GTK1 basiert. PHP 5, basierend auf der Zend Engine 2, bringt die vielen schon bekannten Vorteile – echte Objektorientierung mit allem was dazugehört: Sichtbarkeiten von Attributen und Methoden, echte statische Funktionen, Mehrfachvererbung, Objektdestruktoren, Exceptions und mehr. Auch wenn sich GTK 2 und GTK1 äußerlich sehr ähnlich sehen, hat sich unter der Haube eine Menge getan: So gibt es eine neue Bibliothek namens „Pango“, die für das Rendern von Text zuständig ist. Wer einmal mehrsprachige Programme mit verschiedenen Schriftsätzen unter GTK1 programmiert hat, der kennt das Problem, dass man die Zeichen nicht mischen kann und sich auf einen (Iso-)Zeichensatz festlegen musste. Pango bietet volle Unicodeunterstützung durch UTF-8, unterstützt bidirektionalen Text und Antialiasing. Weiterhin gibt es das Accessibility Toolkit (ATK), mit dem es möglich ist, die Oberfläche für Screenreader, Lupenprogramme und alternative Eingabemethoden fit zu machen. Zu den grundlegenderen Verbesserungen gehört die Möglichkeit, das MVC-Muster (Model-View-Controller) vollständig ausleben zu können. Die grafische Repräsentation und die Datenhaltung der Widgets sind voneinander getrennt. Text wird zum Beispiel im GtkTextBuffer gehalten und modifiziert, während GtkTextView für die Anzeige dessen zuständig ist. Dasselbe gilt für Baumstrukturen: Ein GtkTreeStore-/GtkListStore-Objekt hält die Daten vor, und ein GtkTreeView oder eine GtkComboBox visualisiert sie. Weiterhin unterstützen die Widgets das Oberserver-Pattern: Derselbe Text kann in verschiedenen Views (gerne auch mit unterschiedlichen Formatierungen) dargestellt werden und ändert sich überall, wenn der Benutzer den Text in nur einem Textfeld ändert. Außerdem lassen sich Daten in einer Liste auf verschiedenen Widgets verwenden: Man könnte zum Beispiel eine große Liste mit vielen Produkten haben, darüber ein Dropdown mit den Produktkategorien – beide Komponenten werden mit den Daten desselben Modells gefüttert, und wenn man im Bearbeiten-Dialog dem Produkt eine neue Kategorie zuweist, erscheint diese automatisch im Dropdown. Die Produktliste wird ebenfalls aktualisiert. All dies passiert automatisch – in GTK1 musste man die Daten per Hand in jedem einzelnen Widget ändern. Listen- und Baumdaten müssen nicht mehr umgeordnet werden, nur weil der Benutzer sie sortieren möchte: Die Überlgerung mehrerer Modelle erlaubt es, mehrstufige virtuelle Reihenfolgen zu definieren: Über dem eigentlichen Datenmodell liegt ein Filter, der einige Produkte versteckt, darüber wieder liegt ein Sortierfilter, den der Benutzer über die Tabellenköpfe anpassen kann. Die Änderungen an der Sortierung lassen die ursprünglichen Daten intakt, die Filterung versteckt die Einträge, anstatt sie zu entfernen. Ein anderes großes Problem mit PHP-GTK1 war der Arbeitsspeicher bzw. das schlecht implementierte Speichermanagement: Aufgrund fehlender Destruktoren füllte sich dieser immer mehr – bis er überlief. Mit PHP 5, dessen Objektorientierung stark von PHP-GTK 2 beeinflusst wurde, kann man per Destruktoren Speicher wieder freigeben. Speicherlecks gehören damit der Vergangenheit an.

Abb. 1: PEAR_Frontend_Gtk2 hat ein Paket erfolgreich installiert
Dokumentation

Manch einer, der in den Anfangsjahren einen Blick auf PHP-GTK geworfen hat, wurde von der mangelhaften Dokumentation abgeschreckt. Es gab zwar eine Liste mit Klassen, deren Funktionen und den Parametern, aber meistens keine Erklärung dazu – was die Lernkurve viel zu steil machte. Seit der Wiederbelebung durch PHP 5 wurde die Doku allerdings stark vervollständigt und es gibt kaum noch weiße Flecken. PHP-GTK 2 hat ein komplett neues Manual bekommen, welches viel Wert auf ausführliche Codebeispiele und Screenshots legt.

Programme, Programme, Programme!

Obwohl die Alpha-Version von PHP-GTK 2 recht frisch ist, so sind schon die ersten Applikationen und Tools verfügbar:

  • Gtk2_VarDump ist ein neues PEAR-Paket, mit dem man Variableninhalte und Objekte in einem Baum darstellen kann, was vor allem bei tief verschachtelten Arrays eine echte Hilfe darstellt.
  • PEAR_Frontend_Gtk2 erlaubt es, PEAR-Pakete zu managen: Installieren, deinstallieren, updaten – alles ist nur einen Mausklick entfernt. Das Paket wird derzeit kräftig entwickelt und wird Teil des offiziellen PEAR-Pakets werden – über „pear -G“ kann die PHP-GTK 2-Oberfläche gestartet werden, sodass das Paket dann installiert ist.
  • Dev_Inspector benutzt die Reflection-Funktionalität von PHP 5, um eine lebende Dokumentation zu erstellen: Das Programm listet alle verfügbaren Klassen und deren zugehörige Methoden mit Parametern und Parametertypen, Properties, Konstanten …

Insgesamt sind in der GTK-2-Kategorie in PEAR schon sechs Klassen verfügbar und einige neue sind in Entwicklung – darunter das HTML_QuickForm-Pendant in GTK 2, Structures_Form_Gtk2.

Abb. 2: Gtk2_VarDump zeigt einen verschachtelten Array
Gnope

Ein großes Problem bei der Verteilung von PHP-GTK1-Programmen an Benutzer war das Setupprogramm für PHP-GTK, denn es gab keins. Das Zip-Paket war für viele zu schwer zu installieren, zumal anfangs zum Beispiel php.ini noch ins Windows-Systemverzeichnis kopiert werden musste. Für PHP-GTK 2 wurde ein eigenständiges Projekt namens „Gnope“ gegründet, welches einen endbenutzerfreundlichen Installer für PHP-GTK 2 unter Windows bereitstellt: Mit diesem kann man eine komplett funktionsfähige PHP-GTK-2-Umgebung, basierend auf PHP 5.1.1, PHP-GTK 2 und PEAR, mit nur ein paar Klicks aufsetzen. Integriert sind die Pakete Gnope_AppRunner und PEAR_Front-end_Gtk2: Mit dem AppRunner können installierte PHP-GTK-2-Programme ausgeführt werden, mit dem Frontend die Pakete direkt aus dem Internet installiert und verbessert werden. Gleichzeitig werden die Pakete im AppRunner registriert und können von nun an per Doppelklick gestartet werden – auf der Kommandozeile müssen keine kryptischen Befehle mehr eingetippt werden.

Abb. 3: Dev_Inspector listet Methoden von GdkWindow

Damit braucht man als Entwickler die eigene Applikation nur als PEAR-Paket zu verpacken, auf dem Gnope- oder einem eigenen Channelserver veröffentlichen und den Benutzer auf das PHP-GTK-2-Setupprogramm verweisen. Anders als bei GTK1 ist mit der mitgelieferten GTK-Wimp-Engine eine optisch nahtlose Integration in die Windowsumgebung möglich, sodass es also keinen Stilbruch auf dem Desktop gibt. Mit PHP 5 und GTK 2 eröffnet sich eine Welt neuer Möglichkeiten, die nur darauf warten, von Ihnen umgesetzt zu werden. Das API wird von Tag zu Tag vollständiger, die Dokumentation besser, die Programme stabiler – warum also nicht mal das nächste Desktopprogramm mit unserer geliebten Programmiersprache umsetzen?

Christian Weiske studiert Informatik in Leipzig, ist als freier Mitarbeiter der Leipziger Internetagentur netresearch in Projekte wie das AIDA Onlinebuchungssystem verwickelt und schreibt in seiner Freizeit an der PHP-GTK-Dokumentation.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -