retornar orientado objetos obj for definir arreglos array php spl arrayobject

php - orientado - Spl, ArrayObject, ArrayObject:: STD_PROP_LIST



php object iterator (1)

Estoy tratando de entender la constante STD_PROP_LIST en la documentación, pero hasta ahora no la entendí, y no encontré ninguna explicación :( La documentación tiene el siguiente ejemplo:

$a = new ArrayObject(array(), ArrayObject::STD_PROP_LIST); $a[''arr''] = ''array data''; $a->prop = ''prop data''; $b = new ArrayObject(); $b[''arr''] = ''array data''; $b->prop = ''prop data''; // ArrayObject Object // ( // [prop] => prop data // ) print_r($a); // ArrayObject Object // ( // [arr] => array data // ) print_r($b);

Ambas impresiones me dan el mismo resultado exacto:

ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] => array data ) ) ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] => array data ) )

Cualquiera podría ayudarme a comprender cuál es la diferencia entre usar esta constante o no.

¡Gracias por adelantado!


El ArrayObject y ArrayIterator son 2 clases que son realmente similares. En realidad, ambos comparten mucho código internamente dentro del núcleo php. Estas dos clases tienen una matriz interna para almacenar los elementos que establece en esas clases.

La STD_PROP_LIST nos dice cómo leer, y ARRAY_AS_PROPS nos dice cómo escribir esos elementos. En primer lugar, la configuración de elementos a través de la notación de matriz estándar ( [] ) siempre funcionará de la misma manera, independientemente de esta configuración.

Al configurar los indicadores ARRAY_AS_PROPS , significa que cuando establece las propiedades (a través de -> ), no se establecerá en el objeto como esperaría con los objetos normales, sino que se almacenará como elementos internos. Si este indicador NO está establecido, almacenará la propiedad en el array-object o array-iterator real, que es lo que ve en el código de salida de su ejemplo: el " prop => propdata " no está dentro del storage:ArrayObject:private , que hubiera sido el caso si se hubiera establecido el indicador ARRAY_AS_PROPS :

$a = new ArrayObject(); $a[''arr''] = ''array data''; $a->prop = ''prop data''; $b = new ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS); $b[''arr''] = ''array data''; $b->prop = ''prop data''; print_r($a); print_r($b); // Output: ArrayObject Object ( [prop] => prop data [storage:ArrayObject:private] => Array ( [arr] => array data ) ) ArrayObject Object ( [storage:ArrayObject:private] => Array ( [arr] => array data [prop] => prop data ) )

La STD_PROP_LIST decide qué devolver en ciertas condiciones, especialmente en var_dump() . Aunque habrá otros casos, no los he encontrado yo mismo. Si se establece STD_PROP_LIST , devolverá las propiedades que se han establecido en su ArrayObject o ArrayIterator . Si NO está configurado, entonces var_dump() devolverá una lista de los elementos internos que se han almacenado.

La documentación real no es 100% correcta en STD_PROP_LIST . Este indicador afecta a var_dump() , pero no a foreach() . Al usar foreach() , siempre iterará los elementos internos, y nunca las propiedades reales, incluso cuando se haya establecido STD_PROP_LIST .

Estos dos indicadores no se excluyen mutuamente: puede establecer ambos indicadores, pero no tendría mucho sentido hacerlo: significa que las propiedades siempre se agregan como elementos internos ( ARRAY_AS_PROPS ), y queremos devolver las propiedades estándar a través de var_dump ( STD_PROP_LIST ). Como las propiedades no se han establecido, siempre devolverá una lista vacía en ese caso.