Nun, die Frage ist, wo möchten Sie das Schreiben verhindern?
Der erste Schritt macht das Array geschützt oder private Schreiben von außerhalb des Objekts Umfang zu verhindern:
protected $arrArray = array();
Wenn von „außen“ des Arrays, ein Getter Sie gut tun wird. Entweder:
public function getArray() { return $this->arrArray; }
und den Zugriff auf sie wie
$array = $obj->getArray();
oder
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
und den Zugriff auf sie mag:
$array = $obj->arrArray;
Hinweis, dass sie keine Referenzen zurück. Sie können also das ursprüngliche Array nicht außerhalb des Bereichs des Objekts ändern. Sie können das Array selbst ändern ...
Wenn Sie wirklich ein vollständig unveränderbares Array benötigen, können Sie ein Objekt verwenden, das ArrayAccess
verwendet ...
Oder könnten Sie einfach ArrayObject
erweitern und all die Schreibmethoden überschreiben:
class ImmutableArrayObject extends ArrayObject {
public function append($value) {
throw new LogicException('Attempting to write to an immutable array');
}
public function exchangeArray($input) {
throw new LogicException('Attempting to write to an immutable array');
}
public function offsetSet($index, $newval) {
throw new LogicException('Attempting to write to an immutable array');
}
public function offsetUnset($index) {
throw new LogicException('Attempting to write to an immutable array');
}
}
Dann einfach $this->arrArray
eine Instanz des Objekts machen:
public function __construct(array $input) {
$this->arrArray = new ImmutableArrayObject($input);
}
Es unterstützt nach wie vor die meisten Array wie Verwendungen:
count($this->arrArray);
echo $this->arrArray[0];
foreach ($this->arrArray as $key => $value) {}
Aber wenn Sie es versuchen um es zu schreiben, werden Sie
Oh, ein LogicException
... hat aber erkennen, dass, wenn Sie es schreiben müssen, alles, was Sie tun müssen, (innerhalb des Objekts) ist tun:
$newArray = $this->arrArray->getArrayCopy();
//Edit array here
$this->arrArray = new ImmutableArrayObject($newArray);
Wenn ich mein unveränderliches Array haben möchte Laden Sie sich mit Daten zur Erstellung Ich würde die __construct-Funktion überschreiben, rufen Sie den übergeordneten Konstruktor, aber wie setze ich was das Objekt enthält? –
Sehr gute Antwort! Beachten Sie jedoch, dass ein Array Objekte enthalten kann: Jedes Objekt wird als Referenz zurückgegeben und kann sogar mit Ihrer unveränderlichen Klasse geändert werden: '$ a = new ImmutableArrayObject ((object) ['foo' => 'bar')); $ b = $ a [0]; $ b-> foo = 'geändert'; ' – Philipp