MediaWiki REL1_34
GenericArrayObject.php
Go to the documentation of this file.
1<?php
2
35abstract 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 ( !is_null( $input ) ) {
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 ( is_null( $index ) ) {
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->getSerializationData() );
188 }
189
199 protected function getSerializationData() {
200 return [
201 'data' => $this->getArrayCopy(),
202 'index' => $this->indexOffset,
203 ];
204 }
205
216 public function unserialize( $serialization ) {
217 $serializationData = unserialize( $serialization );
218
219 foreach ( $serializationData['data'] as $offset => $value ) {
220 // Just set the element, bypassing checks and offset resolving,
221 // as these elements have already gone through this.
222 parent::offsetSet( $offset, $value );
223 }
224
225 $this->indexOffset = $serializationData['index'];
226
227 return $serializationData;
228 }
229
237 public function isEmpty() {
238 return $this->count() === 0;
239 }
240}
offsetSet( $index, $value)
setElement( $index, $value)
Method that actually sets the element and holds all common code needed for set operations,...
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...