Ну, вопрос в том, где вы хотите предотвратить письмо?
Первый шаг делает массив защищенной или частной защиты от записи из-за пределов области объекта:
protected $arrArray = array();
Если из «вне» массива, геттер сделает вас хорошо. Либо:
public function getArray() { return $this->arrArray; }
И доступ к нему, как
$array = $obj->getArray();
или
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
И доступ к ней нравится:
$array = $obj->arrArray;
Обратите внимание, что они не возвращают ссылки. Таким образом, вы не можете изменить исходный массив вне области действия объекта. Вы можете изменить сам массив ...
Если вам действительно нужен полностью неизменяемый массив, вы можете использовать объект, используя ArrayAccess
...
Или вы могли бы просто расширить ArrayObject
и переписать все методы написания:
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');
}
}
Затем просто сделать $this->arrArray
экземпляр объекта:
public function __construct(array $input) {
$this->arrArray = new ImmutableArrayObject($input);
}
Он по-прежнему поддерживает большинство массива как использование:
count($this->arrArray);
echo $this->arrArray[0];
foreach ($this->arrArray as $key => $value) {}
Но если вы попытаетесь писать в него, вы получите LogicException
...
О, но понимаю, что если вам нужно написать к ней, все, что вам нужно сделать (в пределах объекта), это сделать:
$newArray = $this->arrArray->getArrayCopy();
//Edit array here
$this->arrArray = new ImmutableArrayObject($newArray);
Если я хочу иметь свой неизменяемый массив загрузите себя данными о создании, я бы перезаписал функцию __construct, вызвал родительский конструктор, но как установить, что содержит этот объект? –
Очень хороший ответ! Но заметьте, что массив может содержать объекты: каждый объект возвращается как ссылка и может быть изменен даже с вашим неизменяемым классом: '$ a = new ImmutableArrayObject ((object) ['foo' => 'bar']); $ b = $ a [0]; $ b-> foo = 'changed'; ' – Philipp