MediaWiki  master
GenericArrayObject.php
Go to the documentation of this file.
1 <?php
2 
35 abstract class GenericArrayObject extends ArrayObject {
43  abstract public function getObjectType();
44 
50  protected $indexOffset = 0;
51 
61  protected function getNewOffset() {
62  while ( $this->offsetExists( $this->indexOffset ) ) {
63  $this->indexOffset++;
64  }
65 
66  return $this->indexOffset;
67  }
68 
78  public function __construct( $input = null, $flags = 0, $iterator_class = 'ArrayIterator' ) {
79  parent::__construct( [], $flags, $iterator_class );
80 
81  if ( $input !== null ) {
82  foreach ( $input as $offset => $value ) {
83  $this->offsetSet( $offset, $value );
84  }
85  }
86  }
87 
95  public function append( $value ) {
96  $this->setElement( null, $value );
97  }
98 
107  public function offsetSet( $index, $value ) {
108  $this->setElement( $index, $value );
109  }
110 
121  protected function hasValidType( $value ) {
122  $class = $this->getObjectType();
123  return $value instanceof $class;
124  }
125 
142  protected function setElement( $index, $value ) {
143  if ( !$this->hasValidType( $value ) ) {
144  throw new InvalidArgumentException(
145  'Can only add ' . $this->getObjectType() . ' implementing objects to '
146  . static::class . '.'
147  );
148  }
149 
150  if ( $index === null ) {
151  $index = $this->getNewOffset();
152  }
153 
154  if ( $this->preSetElement( $index, $value ) ) {
155  parent::offsetSet( $index, $value );
156  }
157  }
158 
175  protected function preSetElement( $index, $value ) {
176  return true;
177  }
178 
186  public function serialize() {
187  return serialize( $this->__serialize() );
188  }
189 
197  public function __serialize() {
198  return $this->getSerializationData();
199  }
200 
210  protected function getSerializationData() {
211  return [
212  'data' => $this->getArrayCopy(),
213  'index' => $this->indexOffset,
214  ];
215  }
216 
224  public function unserialize( $serialization ) {
225  $this->__unserialize( unserialize( $serialization ) );
226  }
227 
235  public function __unserialize( $serializationData ) {
236  foreach ( $serializationData['data'] as $offset => $value ) {
237  // Just set the element, bypassing checks and offset resolving,
238  // as these elements have already gone through this.
239  parent::offsetSet( $offset, $value );
240  }
241 
242  $this->indexOffset = $serializationData['index'];
243  }
244 
252  public function isEmpty() {
253  return $this->count() === 0;
254  }
255 }
offsetSet( $index, $value)
setElement( $index, $value)
Method that actually sets the element and holds all common code needed for set operations,...
__unserialize( $serializationData)
preSetElement( $index, $value)
Gets called before a new element is added to the ArrayObject.
__construct( $input=null, $flags=0, $iterator_class='ArrayIterator')
getNewOffset()
Finds a new offset for when appending an element.
getSerializationData()
Returns an array holding all the data that should go into serialization calls.
isEmpty()
Returns if the ArrayObject has no elements.
unserialize( $serialization)
getObjectType()
Returns the name of an interface/class that the element should implement/extend.
hasValidType( $value)
Returns if the provided value has the same type as the elements that can be added to this ArrayObject...