Array-Objekte in PHP

Permanent Link: Array-Objekte in PHP 12. Dezember 2008 Comment 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:

  • count()

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.

Netbeans

Permanent Link: Netbeans 10. Dezember 2008 Comment 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.

Dies und das

Permanent Link: Dies und das 8. November 2008 Comment 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)

Array-Datentypen in C# konvertieren

Permanent Link: Array-Datentypen in C# konvertieren 31. Oktober 2008 Comment 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.

Snapshot 09/08

Permanent Link: Snapshot 09/08 13. September 2008 Comment 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.