Willkommen in der Webstatt Zum Webstatt Blog und Stories
Wasili am 08.02.08 18:06

Ich habe heute als Nebenprodukt einiger meiner Arbeiten eine Möglichkeit gefunden, Arrays als readonly zu markieren. Ich hab zwar absolut keine Ahnung, was das fürn Sinn macht, aber naja :D
Vielleicht kannst ja wer brauchen. Für Einstellungen oder so, die man während dem Script nicht mehr ändern sollte. Wirft wahlweise Fehler, oder eben keine (Standard-Einstellung ist ohne Fehlermeldungen).
Achtung: Die Fehlermeldungen funktionieren *nur* mit eindimensionalen Arrays. Zweidimensionale können auch eingegeben werden, allerdings werfen sie keine Fehler, da die Funktion offsetSet nie aufgerufen wird.

Code:
class ReadonlyArray implements ArrayAccess, Countable {
/**
* 2008 by Basilius "Wasili" Sauter
* "Kreiert" ein readonly-"Array"
* Veröffentlicht unter Public Domain, wo möglich, ansonsten GPL in der Version 2.0 oder CCL by-nc-sa 2.0
*/
protected $data;
protected $showerrors;

public function __construct(array $data, $showerrors = false) {
$this->data = $data;
$this->showerrors = $showerrors;
}

public function offsetExists($offset) {
return array_key_exists($offset, $this->data);
}

public function offsetGet($offset) {
return $this->data[$offset];
}

public function offsetSet($offset, $value) {
if($this->showerrors === true) {
echo "<b>Fatal Error</b>: Try to write in a readonly array (class ReadonlyArray)";
}
}

public function offsetUnset($offset) {
if($this->showerrors === true) {
echo "<b>Fatal Error</b>: Try to delete a key-value-pair from a readonly array (class ReadonlyArray)";
}
}

public function count() {
return count($this->data);
}
}

function markArrayAsReadonly($array, $showerrors = false) {
/**
* 2008 by Basilius "Wasili" Sauter
* "Markiert" ein array als "Readonly"
* Veröffentlicht unter Public Domain, wo möglich, ansonsten GPL in der Version 2.0 oder CCL by-nc-sa 2.0
*/
return new ReadonlyArray($array, $showerrors);
}


Zum Einsatz definiert man einfach ein Array, und übergibt es der Funktion markArrayAsReadonly(). Setzt man den zweiten Parameter auf true, so werden hübsche Fehlermeldungen geworfen.

Beispielcode:
$array = array(
'test' => 'Blub',
'blah' => 'Hihi'
);

$array = markArrayAsReadonly($array);

echo $array['test']; echo "<br />";
echo $array['blah']; echo "<br />";
$array['blah'] = 'newVal';
echo $array['blah']; echo "<br />";


Ausgabe ohne readonly-Trick:
Blub
Hihi
newVal


Mit readonly-Trick:
Blub
Hihi
Hihi



Vorschau (Mit Fehlermeldung-An):
http://www.basi-net.org/tools/test2.php

netcup.de Warum gibt es hier Werbung?
Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt