Bueno, la pregunta es ¿de dónde quieres evitar que escriba?
El primer paso es hacer la matriz protegida o privada para impedir la grabación desde fuera del alcance del objeto:
protected $arrArray = array();
Si desde el "exterior" de la matriz, un captador le hará bien. O bien:
public function getArray() { return $this->arrArray; }
y acceder a ella como
$array = $obj->getArray();
o
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
Y para acceder a él le gusta:
$array = $obj->arrArray;
en cuenta que no devuelven referencias. Por lo tanto, no puede cambiar la matriz original fuera del alcance del objeto. Puede cambiar la matriz en sí ...
Si realmente necesita una matriz completamente inmutable, puede usar un objeto usando ArrayAccess
...
O, simplemente puede extender ArrayObject
y sobrescribir todos los métodos de escritura:
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');
}
}
Luego, basta con hacer $this->arrArray
una instancia del objeto:
public function __construct(array $input) {
$this->arrArray = new ImmutableArrayObject($input);
}
Todavía es compatible con la mayoría matriz como Usos:
count($this->arrArray);
echo $this->arrArray[0];
foreach ($this->arrArray as $key => $value) {}
Pero si intentas escribir en él, obtendrá un LogicException
... Oh
, pero se da cuenta de que si tiene que escribir en él, todo lo que tiene que hacer (dentro del objeto) es hacer:
$newArray = $this->arrArray->getArrayCopy();
//Edit array here
$this->arrArray = new ImmutableArrayObject($newArray);
Si yo quiero tener mi matriz Inmutable cargarse con datos sobre la creación me sobrescribir la función __construct, llamar al constructor padre, pero ¿cómo puedo establecer lo que el objeto contiene? –
¡Muy buena respuesta! Pero se dio cuenta de que un array puede contener objetos: Cada objeto se devuelve como una referencia y puede ser cambiado, incluso con su clase inmutable: '$ a = new ImmutableArrayObject ((objeto) [ 'foo' => 'bar']); $ b = $ a [0]; $ b-> foo = 'cambiado'; ' – Philipp