example - Diferencia entre ArrayIterator, ArrayObject y Array en PHP
array iterator java (5)
¿Alguien puede explicar claramente las diferencias fundamentales entre ArrayIterator
, ArrayObject
y Array en PHP en términos de funcionalidad y operación? ¡Gracias!
ArrayObject y array son algo parecidos. Simplemente una colección de objetos (o tipos nativos). Tienen algunos métodos diferentes a los que puedes llamar, pero en su mayoría se reduce a lo mismo.
Sin embargo, un iterador es algo completamente distinto. El patrón de diseño del iterador es una forma de asegurar su matriz (haciéndola solo legible). Tomemos el siguiente ejemplo:
Tienes una clase que tiene una matriz. Puede agregar elementos a esa matriz utilizando addSomethingToMyArray. Sin embargo, tenga en cuenta que hacemos algo para crear un elemento antes de agregarlo a la matriz. Esto podría ser cualquier cosa, pero actuemos por un momento como si fuera muy importante que este método se active para CADA elemento que deseamos agregar a la matriz.
class A
{
private $myArray;
public function returnMyArray()
{
return $this->myArray;
}
public function addSomethingToMyArray( $item )
{
$this->doSomethingToItem( $item );
array_push( $item );
}
}
El problema con esto, es que pasa la matriz por referencia aquí. Eso significa que las clases que realmente usan returnMyArray obtienen el objeto myArray real. Eso significa que las clases que no sean A pueden agregar cosas a esa matriz y, por lo tanto, también cambiar la matriz dentro de A sin tener que usar addSOmethingToMyArray. Pero necesitábamos hacer algo, ¿recuerdas? Este es un ejemplo de una clase que no tiene control de su propio estado interno.
La solución a esto es un iterador. En lugar de pasar la matriz, pasamos la matriz a un nuevo objeto, que solo puede LEER cosas de la matriz. El iterador más simple que existe es algo como esto:
<?php
class MyIterator{
private $array;
private $index;
public function __construct( $array )
{
$this->array = $array;
}
public function hasNext()
{
return count( $this->array ) > $this->index;
}
public function next()
{
$item = $this->array[ $this->index ];
this->$index++;
return $item;
}
}
?>
Como puede ver, no tengo forma de agregar nuevos elementos a la matriz dada, pero sí tengo la posibilidad de leer la matriz de esta manera:
while( $iterator->hasNext() )
$item = $iterator->next();
Ahora, nuevamente, solo hay una forma de agregar elementos a myArray en A, a saber, mediante el método addSomethingToArray. Así que eso es lo que es un iterador, es algo así como una cáscara alrededor de las matrices, para proporcionar algo que se llama encapsulación.
Puede que encuentres tu respuesta aquí:
Este iterador permite desarmar y modificar valores y claves mientras se itera sobre Arrays y Objetos.
Cuando quiera iterar sobre la misma matriz varias veces, necesita crear una instancia de ArrayObject y dejar que cree instancias de ArrayIterator que se refieran a ella usando foreach o llamando a su método getIterator () manualmente.
También lea:
Un Iterator es un objeto que permite a un programador atravesar un contenedor, particularmente listas. A menudo se proporcionan varios tipos de iteradores a través de la interfaz de un contenedor.
No hay mucha diferencia entre ArrayObject
y Array
ya que representan las mismas cosas, aunque utilizan diferentes tipos de objetos.
ArrayIterator
es un iterador que itera sobre objetos Array-like
, esto incluye todos los objetos que implementan ArrayAcess
y el tipo de Array
nativo. De hecho, cuando foreach
sobre una matriz, PHP crea internamente ArrayIterator
para realizar el desplazamiento y transformar su código para que parezca que ha escrito esto.
for( $arrayIterator->rewind(); $arrayIterator->valid(); $arrayIterator-
>next())
{ $key = $arrayIteartor->key();
$value = $arrayIterator->current();
}
Como puede ver, cada objeto de colección tiene un iterador, excepto las colecciones definidas para las que necesita definir sus propios iteradores.
Array
es un tipo de php nativo. Puede crear uno usando la array()
construcción del lenguaje php array()
, o a partir de php 5.4 en adelante []
ArrayObject
es un object
que funciona exactamente como matrices. Estos pueden ser creados usando una new
palabra clave
ArrayIterator
es como ArrayObject
pero puede iterar sobre sí mismo. También creado usando new
Comparando Array
vs ( ArrayObject
/ ArrayIterator
)
Ambos se pueden utilizar utilizando la sintaxis de la matriz de php, por ejemplo.
$array[] = ''foo'';
$object[] = ''foo'';
// adds new element with the expected numeric key
$array[''bar''] = ''foo'';
$object[''bar''] = ''foo'';
// adds new element with the key "bar"
foreach($array as $value);
foreach($object as $value);
// iterating over the elements
Sin embargo, siguen siendo objetos contra matrices, por lo que notaría las diferencias en
is_array($array); // true
is_array($object); // false
is_object($array); // false
is_object($object); // true
La mayoría de las funciones de matriz php esperan matrices, por lo que usar objetos arrojaría errores. Hay muchas de esas funciones. Por ejemplo.
sort($array); // works as expected
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......
Finalmente, los objetos pueden hacer lo que cabría esperar de un objeto stdClass
, es decir, acceder a las propiedades públicas mediante la sintaxis del objeto.
$object->foo = ''bar''; // works
$array->foo = ''bar''; // Warning: Attempt to assign property of non-object in ....
Las matrices (siendo el tipo nativo) son mucho más rápidas que los objetos. Por otro lado, las clases ArrayObject
y ArrayIterator
tienen ciertos métodos definidos que puede usar, mientras que no existe tal cosa para los arreglos.
Comparando ArrayObject
vs ArrayIterator
La principal diferencia entre estos 2 está en los métodos que tienen las clases.
El ArrayIterator
implementa la interfaz ArrayIterator
que le proporciona métodos relacionados con la iteración / bucle sobre los elementos. ArrayObject
tiene un método llamado exchangeArray
que intercambia su matriz interna con otra. Implementar algo similar en ArrayIterator
significaría crear un nuevo objeto o pasar por las teclas y unset
todas una por una y luego configurar los elementos de la nueva matriz uno por uno.
A continuación, dado que el ArrayObject
no puede ser iterado, cuando lo usa en foreach
crea un objeto ArrayIterator
internamente (igual que los arreglos). Esto significa que php crea una copia de los datos originales y ahora hay 2 objetos con el mismo contenido. Esto resultará ser ineficiente para matrices grandes. Sin embargo, puede especificar qué clase usar para el iterador, por lo que puede tener iteradores personalizados en su código.
Espero que esto sea de ayuda. Las ediciones a esta respuesta son bienvenidas.
array
es uno de los ocho tipos primitivos en PHP. Aunque viene con muchas funciones de utilidad incorporadas, pero todas son de procedimiento.
Tanto ArrayObject
como ArrayIterator
nos permiten crear matrices de ciudadanos de primera clase en un programa orientado a objetos (OOP).
La diferencia entre ArrayObject
y ArrayIterator
es que, dado que ArrayIterator
implementa la interfaz SeekableIterator
, puede hacer $myArray->seek(10);
con ArrayIterator
.