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](/assets/img/smilies/biggrin.gif)
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