Como converter objeto PHP em array associativo: 3 métodos práticos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Do objeto ao array: por que isso é necessário e como evitar armadilhas

\n\n

Todo desenvolvedor PHP, mais cedo ou mais tarde, enfrenta a seguinte situação: você tem um objeto (vindo de uma API, banco de dados ou biblioteca), mas precisa de um array associativo comum. Parece uma operação simples, mas, como sempre, o diabo está nos detalhes. Uma conversão incorreta pode resultar em perda de dados, tipos inesperados ou erros fatais.

\n\n

Neste artigo, vamos explorar três abordagens principais para converter um objeto PHP em um array associativo, comparando seu desempenho, profundidade de processamento e possíveis problemas. Você descobrirá qual método escolher para 90% das tarefas e qual é melhor deixar para experimentos de laboratório. Vamos nessa!

\n\n

Método 1: O casting mágico com (array)

\n\n

A maneira mais óbvia e concisa é usar o casting de tipo: (array) $objeto. Este método é nativo do PHP e funciona "de fábrica". Vejamos um exemplo.

\n\n
<?php\n$usuario = new stdClass();\n$usuario->nome = 'Carlos';\n$usuario->idade = 28;\n$usuario->email = 'carlos@exemplo.com';\n\n$array = (array) $usuario;\nprint_r($array);\n?>
\n\n

Resultado:

\n\n
Array\n(\n    [nome] => Carlos\n    [idade] => 28\n    [email] => carlos@exemplo.com\n)
\n\n

Parece ideal? Quase. Mas existem nuances.

\n\n

Vantagens do método (array)

\n
    \n
  • Simplicidade e velocidade — uma única operação, sem loops.
  • \n
  • Funciona com qualquer objeto, incluindo instâncias de classes personalizadas.
  • \n
  • Preserva as propriedades públicas do objeto.
  • \n
\n\n

Desvantagens e armadilhas

\n
    \n
  • Não é recursivo — se uma propriedade do objeto for outro objeto, ela não será convertida em array. Você terá um objeto aninhado dentro do array.
  • \n
  • Problema com propriedades private/protected — elas entram no array, mas com nomes contendo caracteres nulos (\\0). Isso quebra a serialização.
  • \n
  • Alteração de chaves — para classes nativas (DateTime, PDOStatement), o comportamento pode ser imprevisível.
  • \n
\n\n

Exemplo do problema com propriedade private:

\n\n
<?php\nclass Usuario {\n    public $nome = 'João';\n    private $senha = 'segredo123';\n}\n\n$usuario = new Usuario();\n$array = (array) $usuario;\nvar_dump(array_keys($array));\n// Exibe: array(2) { [0]=> string(4) "nome" [1]=> string(19) "\\0Usuario\\0senha" }\n?>
\n\n

Como você pode ver, a chave \\0Usuario\\0senha não é exatamente o que você gostaria de ver no seu código.

\n\n

Método 2: A ponte JSON (json_decode + json_encode)

\n\n

A segunda abordagem popular é serializar o objeto em JSON e depois decodificá-lo como array. Isso resolve o problema da recursão e das propriedades privadas, mas adiciona custos extras de processamento.

\n\n
<?php\n$objeto = new stdClass();\n$objeto->nome = 'Maria';\n$objeto->habilidades = ['PHP', 'JavaScript', 'Python'];\n\n$array = json_decode(json_encode($objeto), true);\nprint_r($array);\n?>
\n\n

Resultado:

\n\n
Array\n(\n    [nome] => Maria\n    [habilidades] => Array\n        (\n            [0] => PHP\n            [1] => JavaScript\n            [2] => Python\n        )\n)
\n\n

Agora o array aninhado habilidades também se tornou um array, e não um objeto. Perfeito!

\n\n

Quando este método é útil

\n
    \n
  • Estruturas profundamente aninhadas — a recursão é tratada automaticamente.
  • \n
  • Limpeza dos dados — sem caracteres de controle nas chaves.
  • \n
  • Compatibilidade — se você já trabalha com JSON (API, bancos de dados), esta é a escolha natural.
  • \n
\n\n

Desvantagens da abordagem JSON

\n
    \n
  • Perda de tipos — números inteiros permanecem inteiros, mas objetos como DateTime são convertidos em strings. Objetos com métodos perdem seu comportamento.
  • \n

Blogs

Book Recommendations