Peki, soru nereden yazmayı önlemek istersiniz?
ilk adım dizisi korumalı veya nesne kapsam dışından yazma önlemek için özel yapıyor:
protected $arrArray = array();
dizinin "dışarıdan" gelen, gaz giderici bir ince sizi yapacağız. Ya:
public function getArray() { return $this->arrArray; }
Ve erişen
$array = $obj->getArray();
veya
public function __get($name) {
return isset($this->$name) ? $this->$name : null;
}
Ve gibi erişen
gibi: onlar referanslar dönmemeleri
$array = $obj->arrArray;
dikkat edin. Böylece, orijinal diziyi nesnenin kapsamı dışında değiştiremezsiniz. Eğer gerçekten tam değişmez dizi gerekiyorsa Sen ArrayAccess
kullanarak Nesne kullanabilirsiniz, dizi kendisi ...
değiştirebilir ...
Veya sadece ArrayObject
uzatmak ve yazma yöntemlerinin hepsi üzerine yazabilirsiniz: Hala gibi en diziyi destekler
public function __construct(array $input) {
$this->arrArray = new ImmutableArrayObject($input);
}
: Sonra
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');
}
}
, basitçe $this->arrArray
nesnesinin bir örneği yapmak kullanımları:
count($this->arrArray);
echo $this->arrArray[0];
foreach ($this->arrArray as $key => $value) {}
$newArray = $this->arrArray->getArrayCopy();
//Edit array here
$this->arrArray = new ImmutableArrayObject($newArray);
Immutable Array'ım var mı? kendini oluşturmadaki verilerle yüklerim __construct işlevinin üzerine yazılır, üst yapıcıyı çağırırdım, ancak nesnenin içeriklerini nasıl ayarlayabilirim? –
Çok iyi cevap! Ancak bir dizinin nesneler içerebileceğine dikkat edin: Her nesne bir referans olarak döndürülür ve değişmez sınıfınızla bile değiştirilebilir: '$ a = new ImmutableArrayObject ((object) ['foo' => 'bar']); $ b = $ a [0]; $ b-> foo = 'değiştirildi'; – Philipp