Convertendo objetos PHP em matrizes para ler membros privados

Desde muito tempo atrás, o PHP suporta o recurso muito interessante, porém, de conversão de objeto em array por meio de conversão simples via (array):

<?php

class Foo {
public $bar = 'barValue';
}

var_dump
((array) new Foo());

Você pode ver um exemplo de execução em http://3v4l.org/FC3WT

Isso nos permite aplicar conversões rápidas ao serializar dados em JSON ou XML, por exemplo.

Estranhamente, também nos permite recuperar propriedades privadas e protegidas:

<?php

class Foo {
public $bar = 'barValue';
protected $baz = 'bazValue';
private $tab = 'tabValue';
}

var_dump
((array) new Foo());

Um exemplo ao vivo está em http://3v4l.org/sGnfO

As chaves para valores privados e protegidos são bastante estranhas:

  • Para valores protegidos, a chave é "*$propertyName"
  • Para valores privados, a chave é "$classFQCN$propertyName"

Você pode ver uma rápida demonstração em http://3v4l.org/6o7Ac

Embora isso possa não fazer sentido para muitas pessoas, é assim que o PHP realmente representa os objetos internamente, e é pensado dessa forma para evitar colisões na serialização de objetos.

Use com cuidado – viola claramente os princípios OOP

Escrevi mais extensivamente sobre o tópico em http://ocramius.github.io/blog/fast-php-object-to-array-conversion/