Spl, ArrayObject, ArrayObject :: STD_PROP_LIST

Estou tentando entender STD_PROP_LIST constante na documentação, mas até agora não entendi, e não encontrei nenhuma explicação 🙁 A documentação tem o seguinte exemplo:

$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 as impressões me dão o mesmo resultado exato:

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

Qualquer um poderia me ajudar a entender qual a diferença entre usar esta constante ou não?

Desde já, obrigado!

ArrayObject e ArrayIterator são 2 classs que são realmente semelhantes. Na verdade, ambos compartilham muito código internamente dentro do núcleo php. Essas duas classs possuem uma matriz interna para armazenar os elementos que você definiu para essas classs.

O STD_PROP_LIST nos diz como ler e ARRAY_AS_PROPS nos diz como escrevermos esses elementos. Em primeiro lugar, definir elementos através da notação de matriz padrão ( [] ) sempre funcionará da mesma maneira, independentemente dessas configurações.

Ao configurar os sinalizadores ARRAY_AS_PROPS , isso significa que quando você define propriedades (através do -> ), não será configurado no object como você esperaria com objects comuns, mas será armazenado como elementos internos. Se esta bandeira não estiver definida, ela armazenará a propriedade no array-object atual ou array-iterator, que é o que você vê no código de saída do seu exemplo: o ” prop => propdata ” não está dentro do storage:ArrayObject:private , o que teria sido o caso se o sinalizador ARRAY_AS_PROPS tivesse sido definido:

 $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 ) ) 

O STD_PROP_LIST decide sobre o que devolver em determinadas condições, principalmente em var_dump() . Embora existam outros casos, não os encontrei sozinhos. Se o STD_PROP_LIST estiver configurado, ele retornará as propriedades que foram definidas em sua class ArrayObject ou ArrayIterator . Se não estiver definido, var_dump() retornará uma lista dos elementos internos que foram armazenados.

A documentação real não está 100% correta em STD_PROP_LIST . Esta bandeira afeta var_dump() , mas não foreach() . Ao usar foreach() , ele sempre itera os elementos internos, e nunca as propriedades reais, mesmo quando STD_PROP_LIST foi configurado.

Esses dois sinalizadores não são mutuamente exclusivos: você pode definir ambos os sinalizadores, mas não faz muito sentido ao fazê-lo: isso significa que as propriedades sempre são adicionadas como elementos internos ( ARRAY_AS_PROPS ), e queremos retornar as propriedades padrão através de var_dump ( STD_PROP_LIST ). Como as propriedades não podem ter sido configuradas, sempre retornará uma lista vazia nesse caso.

    Intereting Posts