Die geistigen Wirrungen des Sebastian Bauer
Saturday, December 13. 2008
Typsicheres Set für PHP
Nils hat in seinem Blog phphatesme.com eine kleine Aufgabe gestellt.
Es geht es darum, ein typsicheres Set zu programmieren.
Mein Lösungsvorschlag soll also hiermit folgen. Kurz vorab zu meinem Ansatz: da ich generell das Handling von Arrays in PHP mag, hab ich mich am ArrayIterator orientiert. Mir ist die genaue Definition eines Sets nicht bekannt, kann also nicht sagen, ob sich das ausschließt. Aber das ist mein Ansatz für ein Typsicheres Set, das sich einem Array vollkommen gleich bedienen lässt. Man behält also auch alle iterativen Möglichkeiten oder Sortierfeatures bei.
Zur Typsicherheit habe ich mich auf Objekte bezogen. Wer in dem Set also mit primitiven Datentypen arbeiten möchte, muss die widerum in einem Objekt abbilden (was aber über die SPL ja auch möglich ist).
Hier also mein Ansatz.
class Set extends ArrayIterator
{
private $objectType;
public function __construct( $sourceObject )
{
$this->objectType = get_class( $sourceObject );
}
// Overwrite offsetSet method for checking the type and if the object already exists
public function offsetSet( $offset, $value )
{
if( get_class( $value ) != $this->objectType ) {
throw new Exception( "The type of the given object \"".get_class( $value )."\" does not match the expected type \"".$this->objectType."\"" );
}
foreach( $this as $object ) {
if( $object == $value ) {
throw new Exception( "Object already added to set" );
}
}
parent::offsetSet( $offset, $value );
}
}
class FooBar {
private $someText;
public function __construct( $someText )
{
$this->someText = $someText;
}
public function getSomeText( )
{
return $this->someText;
}
}
class FooBar2 {
}
$orange = new FooBar( "Orange" );
$set = new Set( $orange );
$set[] = $orange;
try {
// Throws an exception since we defined FooBar to be the type of the set
$set[] = new FooBar2( );
} catch( Exception $e ) {
echo $e->getMessage();
}
try {
// Should throw an exception, too, since $orange has already been added
$set[] = $orange;
} catch( Exception $e ) {
echo $e->getMessage();
}
$set[] = new FooBar( "Apple" );
$set[] = new FooBar( "Lemon" );
echo "\nThe set contains ".count( $set )." items.\n";
foreach( $set as $object ) {
echo get_class( $object )." - ".$object->getSomeText()."\n";
}
Posted by Sebastian Bauer
in Software & Coding
at
11:37
| Comments (0)
| Trackback (1)
Related entries by tags:
phphatesme.com feiert Geburtstag!
Feiertage rum und sonstiges aus der umgebenen Blogosphäre
The golden Rules of PHP
cURL Probleme mit LFSW ServerScript und RacerOnlineScript gefixt
Wie man unter PHP Eventhandler aus HTML Elementen filtert
phphatesme.com feiert Geburtstag!
Feiertage rum und sonstiges aus der umgebenen Blogosphäre
The golden Rules of PHP
cURL Probleme mit LFSW ServerScript und RacerOnlineScript gefixt
Wie man unter PHP Eventhandler aus HTML Elementen filtert
Quicksearch
Kategorien
Twitter Aktivität
Gallerie
Tag Cloud
überwachung anonymizer bhut jolakia bluetooth car design dhtml gforce giiforce google hockenheimring html javascript laengsbeschleunigung lfs lfsworld linux live for speed mein roadster php PHP Conf. / Webinale 2007 piraten piratenpartei privacy privatsphäre remote render roadster schäuble security server smart stasi2.0 ubuntu web2.0 wii wiimote wiiremote wiiremotej wwweb
Beliebteste Einträge
Statistiken
Letzter Artikel: 07.08.2009 07:00
198 Artikel wurden geschrieben
236 Kommentare wurden abgegeben
Links
Blog Administration
Choose Language
Creative Commons
© Copyright 2008, Die Milchtüte design by Sebastian Bauer, based on a port for s9y by nerdwg.org



Tracked: Dec 29, 08:46
Ich hoffe, ihr habt die Feiertage alle gut herumbekommen. Ich erhielt heute morgen schon prompt die erste Mail, dass mein Teamleiter krank ist und sich den Magen verstimmt hat. Naja, meinerseits lief alles bestens. Zu meiner WiiMote, die ich ja für mein G