madcats[welt]

Netbeans

Einige werden sich fragen, warum ich als primärer PHP- und C#-Entwickler nun über eine Java-IDE schreibe: Seit Version 6.5 hat Netbeans eine offizielle PHP-Unterstützung. Zwar bieten das viele Entwicklungsumgebungen, aber wirklich überzeugen konnte ich mich bisher keine. Zumal mein geliebtes UE Studio teilweise auch entsprechende Funktionen bietet.

Netbeans dagegen gefiel mir auf anhieb. Es ist klar strukturiert, nicht überfrachtet und hat eine funktionale grafische Oberfläche. Dazu beherrschaft die Code-Vervollständigung sogar noch CSS und Javascript – bei letzterem werden sogar Browser-Kompatbilitäten der verschiedenen Methoden angezeigt.

Plug-Ins sind für nahezu alle wichtigen Zwecke vorhanden, egal ob C/C++, Ruby, SOA oder CVS/SVN. Außerdem lassen sie sich bequem über das GUI auswählen bzw. verwalten.

Die PHP-Unterstützung ist stellenweise noch etwas holprig. So bietet z.B. das SVN-Modul noch keine Möglichkeit, ein neues Projekt direkt aus einem Checkout zu erstellen. Und es gesellen sich noch ein paar kleinere Bugs dazu. Dennoch kann ich nur empfehlen, Netbeans 6.5 zumindest auszuprobieren. Mit etwas Feinschliff ist genug Potenzial verhanden, eine der besten PHP-IDEs anzubieten. Weiter so, Sun!

Ich habe mich dazu entschlossen, die Weiterentwicklung von Ruby und vor allem Sapphire in Netbeans zu übernehmen. Den bereits vorhandenen Code von Sapphire habe ich gelöscht und das Projekt neu begonnen. Meine bisherigen Konzepte haben sich schnell als nicht praktikabel herausgestellt.

Manchmal hätte ich große Lust, PHP zum Teufel zu jagen und alles mit C# bzw. ASP.NET zu machen, aber ein Windows-Webserver kommt definitiv nicht in Frage. Hierzu werde ich in den nächsten Tagen noch etwas ausführlicher schreiben.

Ruby Alpha 3

Änderungen gegenüber der Alpha 2:

  • Klasse Config:
    1. Methode delVar() entfernt
    2. Methode delete() hinzufügt:
      Vereinheitlicht das Namensschema und ist in der Lage mehrere Konfigurationsvariablen auf einmal zu löschen.
    3. Magische Methode __toString() implementiert.
      Gibt alle gespeicherten Konfigurationsvariablen mittels print_r() zurück.
    4. Magische Methode __get() gibt nun eine Fehlermeldung zurück, wenn auf eine nicht verfügbare Konfigurationsvariable zugegriffen wird.
    5. Konfigurationsvariablen ScriptName, ScriptDir, ScriptRoot, ScriptURL, TemplateDir, TemplateURL, TemplateName, TemplateDateFormat, TemplateTimeFormat und TemplateDateTimeFormat wurden in die Unterobjekte script und template der Klasse Data zugeorndet. Die Präfixe Template und Script entfallen. Außerdem beginnen die Eigenschaften alle mit Kleinbuchstaben.
  • Klasse MySmarty:
    1. Es ist nicht länger notwendig, die Smarty-Methoden assign() und assign_by_ref() zu verwenden, um Smarty Variablen zuzuweisen. Stattdessen wird über die magischen Methoden __get() und __set() dem Smarty-Objekt der entsprechende Wert übergeben.
    2. Magische Methoden __get(), __set(), __isset() und __unset() implementiert.
      Ermöglichen og. Vereinfachungen, um Smarty mit Variablen zu füttern.
  • Vereinheitlichtes Namensschema aller Konfigurationsvariablen entsprechend og. Änderungen zu Kleinbuchstaben am Namensbeginn.
  • Vereinheitlichte Klassennamen im Core-System.
  • Datenbankschnittstelle über PDO hinzugefügt, Ausnahmen werden über die Klasse PDOException statt DbException gehandhabt.
  • Die verfügbaren Datenbankschnittstellen MySQL, MySQLi und PDO lassen sich über die Konfigurationsdatei anwählen.
  • Markup-Vereinfachungen im Standard-Layout
  • Update auf Smarty 2.6.20 und jQuery 1.2.6
  • Anpassungen aller Klassen und Templates an das neue Namensschema und Smarty-Variablen-Handling.
  • Funktion json_encode() wird hinzugefügt, falls PHP 5.2 ohne JSON-Erweiterung kompiliert wurde.
  • Grundsätzliche Funktionalität, um falsch als Spam oder Ham erkannte Kommentare an Akismet zu melden.
  • Weitere kleine Optimierungen und Vereinfachungen der Core- und Modul-Klassen.

Geplante Änderungen bis zur ersten Beta-Version:

  • Wegfall der normalen MySQL-Schnittstelle und Unterstützung für MySQL 4.1.
  • Absicherung über vorbereitete SQL-Abfragen mittels der Methode prepare() von MySQLi bzw. PDO.
  • Namespaces für den Core und die Module, sofern PHP 5.3 verfügbar ist.
  • Admin-Bereich für Kategorien/Tags, Kommentare, Bilder, Texte und Konfigurations-Verwaltung.
  • Neues Tag- und Kategorie-Handling im Admin-Bereich.
  • Spam-Schutz ohne Akismet und Captchas.
  • Module Texts und Images implementieren.
  • Multi-Weblog-Unterstützung über mehrere Domains hinweg.
  • json_encode() durch Zend_Json_Encoder::encode() ersetzen.

Snapshot 09/08

Filme: Transformers, John Rambo (einfach nur schlecht)

Serien: House MD Season 4 (ORF1), Battlestar Galacatica Season 1 (DVD)

Lesen: James Luceno – Star Wars: Der Untergang, aktuelles PHP-Magazin

iTunes: Queen & Paul Rodgers – Cosmos Rockin’, The Ting Tings – Shut up and let me go

Spiele: Warhammer Online, SolFree (iPod touch), Civilization IV

Programmiersprache des Monats: C# 3.o – LINQ rockt einfach!

Und an dieser Stelle noch herzlichen Dank an die Südostbayernbahn für eine kostenlose Woche in der 1. Klasse. War sehr angenehm.

Singleton mit PHP 5

Singleton ist ein sog. Design Pattern, zu Deutsch Entwurfsmuster. Einfach gesagt, sind es Standardlösungen für bestimmte Problemstellungen innerhalb der objektorientierten Programmierung, die immer wieder auftreten.

Eines der einfachsten Muster ist das Singleton. Es stellt sicher, dass von einer Klasse nur eine Instanz erzeugt werden kann und keine weitere. Bei bestimmten Objekten, z.B. für die Datenbank-Verbindung, kann das sehr hilfreich sein. Da ein Singleton über eine statische Methode aufgerufen wird, ist es außerdem möglich dieselbe Instanz einer Klasse ohne Probleme überall im Script aufrufen zu können – widerrum sehr nützlich bei Datenbanken.

So sieht in Singleton in PHP 5 aus:

<?php

class Demo {

	/**
	 * @access private
	 * @static
	 * @var object
	 */

	private static $_instance = null;

	/**
	 * Singleton
	 *
	 * @access public
	 * @static
	 * @return object self::$Instance
	 */

	public final static function getInstance() {
		if(!self::$_instance instanceof Demo) {
			self::$_instance = new Demo();
		}

		return self::$_instance;
	}

	/**
	 * Constructor
	 *
	 * @access private
	 */

	private function __construct() {
		// Code
	}

	/**
	 * No Clone Wars
	 *
	 * @final
	 * @access private
	 */

	public final function __clone() {
		return null;
	}

}

?>

Zuerst wird das statische Attribut $instance als null definiert, gefolgt von der statischen Methode getInstance(). Die überprüft, ob in self::$instance bereits eine Instanz der Klasse hinterlegt ist. Falls nein, wird ein neues Objekt erstellt und die Referenz in self::$instance gespeichert. Anschließend gibt getInstance() die Instanz der Klasse zurück.

Wichtig ist, dass der Konstruktor der Klasse als private definiert ist. Somit ist sichergestellt, dass nur getInstance() ihn aufrufen kann und man keine weiteres Objekt der Klasse erzeugen darf. Ebenso muss die Methode __clone() als private deklariert werden, damit das Objekt nicht kopiert werden darf.

Mit folgendem Code erhält man nun die Instanz der Klasse:

$demo = Demo::getInstance();

Dieser Aufruf funktioniert überall, sobald die entsprechende Klasse eingebunden wurde.

Das Singleton Pattern ist aus diversen Gründen recht umstritten. Viele sind der Ansicht, dass man es gar nicht bräuchte. Das mag vielleicht in der normalen Anwendungsentwicklung zutreffen, aber für Web-Programmierung mit PHP, ist es insbesondere bei Datenbank-Verbindungen sinnvoll. Gerade Anfänger begehen oft in dieser Hinsicht, da die alte MySQL-Schnittstelle verwendet und auf die Verwaltung der einzelnen Verbindungen zum Datenbank-Server gepfiffen wird. Eine DB-Klasse mit Singleton stellt sicher, dass es nur eine Verbindung gibt und das entsprechende Objekt überall verfügbar ist.

Hinweis: aufgrund der mangelhaften Objekt-Unterstützung in PHP 4, ist ein Singleton dort – in der oben gezeigten. Form – nicht möglich.

Frühjahrsputz

Auch wenn das Wetter in diesen Tagen alles andere als an Frühling erinnert, wird es Zeit für eine Renovierung. Parallel zum neuen Layout geht auch mcw[blog] 2.0 an den Start.

An den eigentlichen Funktionen ändert sich nicht viel, abgesehen von »sprechenden« URLs und einer erweiterten Sidebar, deren Einteilung man über ein simples Javascript nach belieben ein- und ausklappen kann.

Intern ist dagegen alles neu, sogar das Datenbank-Schema. Fast alle Code-Teile sind objektorientiert und entsprechen dem Model View Controller-Pattern (MVC). Das mag für ein Weblog übertrieben klingen, aber es lässt sich dadurch sehr einfach erweitern und warten. Die Zeitersparnis ist wirklich enorm, z.B. hat es nur eine gute halbe Stunde gedauert, bis der komplette Feed-Teil (RSS und Atom) fertig war.

Abgesehen vom eigentlichen Weblog-Modul und entsprechenden Zusatzfunktionen wie Kommentare, Kategorien und Feeds, ist aber noch nichts fertig. In der finalen Version wird es möglich sein mit einer Installation mehrere Blogs zu betreiben, die auch auf unterschiedlichen Domains laufen und noch einige andere Dinge, die momentan nur als Konzept existieren – mehr wird nicht verraten.

Und nun wünsche ich allen viel Spaß mit der neuen Version. Kritik, Ideen oder Verbesserungsvorschläge bitte als Kommentar hinterlassen.