12. Dezember 2008
keine kommentare
Bekanntlich sind Arrays in PHP keine Objekte, wie es z.B. in C# oder Java der Fall ist. Dennoch ist es mit den Interfaces und vorgefertigten Klassen der Standard PHP Library (SPL) möglich, eine Klasse zu entwerfen, die sich wie ein Array verhält. Das mag überflüssig oder überdimensioniert erscheinen, aber ich halte es für ein gutes Beispiel, welche Dinge die SPL möglich macht:
<?php
class MyArray implements ArrayAccess, Countable, Iterator {
private $data = array();
public $length = 0;
private $position = 0;
private $keys = array();
public function __construct() {
$args = func_get_args();
if(count($args) > 0) {
foreach($args as $key => $value) {
$this->data[$key] = $value;
$this->length++;
}
$this->keys = array_keys($this->data);
}
}
public function __destruct() {
unset($this->data);
}
public function __set($offset, $value) {
return null;
}
public function __call($method, $args) {
return null;
}
public function offsetExists($offset) {
return isset($this->data[$offset]);
}
public function offsetGet($offset) {
return $this->data[$offset];
}
public function offsetSet($offset, $value) {
$this->data[$offset] = $value;
$this->length++;
$this->keys = array_keys($this->data);
}
public function offsetUnset($offset) {
unset($this->data[$offset]);
$this->length–;
$this->keys = array_keys($this->data);
}
public function count() {
return $this->length;
}
public function rewind() {
$this->position = 0;
}
public function next() {
$this->position++;
}
public function key() {
return $this->keys[$this->position];
}
public function current() {
return $this->data[$this->key()];
}
public function valid() {
if($this->position < $this->length) {
return true;
}
return false;
}
}
?>
Interface ArrayAccess:
- offsetExists()
- offsetGet()
- offsetSet()
- offsetUnset()
Diese Methoden sorgen dafür, dass man das Objekt wie ein ganz normales PHP-Array benutzen kann, d.h. eine Einträge hinzufügen, ausgeben oder löschen.
Interface Countable:
Wie der Name schon sagt, gibt die Methode count() einfach nur die Anzahl der aktuellen Array-Items aus.
Interface Iterator:
- rewind()
- next()
- key()
- current()
- valid()
Wer vor PHP 4 schon anbord war, wird diese PHP-Funktionen sicher noch kennen, um assoziative Arrays über eine while()-Schleife zu iterieren. Und nichts anderes machen auch die entsprechenden Methoden. Nur sorgen sie in diesem Fall dafür, dass man das Array-Objekt mit foreach() durchlaufen kann.
Zusätzlich sind die magischen Methoden __set() und __call() leer implementiert, so dass man die Eigenschaft $length nicht überschreiben kann und nicht beabsichtigte Methodenaufrufe verhindert werden. Der Konstruktor ermöglicht außerdem wie bei array() beim Initialisieren Werte in das Array zu schreiben.
10. Dezember 2008
keine kommentare
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.
8. November 2008
keine kommentare
Filme: Serenity, Indiana Jones and the Kingdom of the Crystal Skull, 28 Weeks later
Serien: Firefly, Battlestar Galactica Mini-Series (iPod)
Lesen: Frank Eller – Visual C# 2008, Andrew Stellman & Jennifer Greene – C# von Kopf bis Fuß
iTunes: Saber Rider and the Star Sheriffs OST
Spiele: Warhammer – Mark of Chaos, Die Siedler 6, Drakensang
Programmiersprache des Monats: immer noch C# 3.0.
Weblog des Monats: Girl Developer (Englisch)
31. Oktober 2008
keine kommentare
Anstatt das Ausgangs-Array mit for() oder foreach() durchzulaufen und dabei das Ziel-Array mit den konvertierten Werten zu füllen, bietet C# dafür eine Lösung über die Methode Array.ConvertAll().
int[] IntArray = Array.ConvertAll<string, int>(StringArray, delegate(string Value) {
return Convert.ToInt32(Value);
});Als Beispiel habe ich hier das Konvertieren von Strings nach Integer gewählt, welches über die anonyme Callback-Funktion abläuft. Somit läuft es wesentlich eleganter ab und ist durch Generics flexibel gehalten.
13. September 2008
kommentare (3)
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.