Webstatt.org - Community seit 2006 - 2012 (2024?)

Readonly-Array

user-343
08.02.2008 17: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 Fettes Grinsen
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