Vous écrivez du code, et PHP vous crie : « Ne me touche pas comme un tableau ! »
\n\nImaginez : vous recevez des données d'une API. Tout est beau, le JSON est parsé, vous êtes sûr d'avoir un tableau. Vous accédez à un élément par sa clé — et au lieu du résultat, vous voyez Fatal error: Cannot use object of type stdClass as array. Ça vous parle ? Cette erreur est l'un des pièges les plus fréquents pour les développeurs PHP débutants (et moins débutants). Sur Stack Overflow, elle a été discutée des milliers de fois. Aujourd'hui, nous n'allons pas seulement expliquer pourquoi elle survient, mais aussi comparer 5 approches pour la contourner ou la prévenir. Vous découvrirez quelle méthode convient à votre tâche, et vous oublierez à jamais la panique face à stdClass.
Cet article s'adresse à ceux qui codent en PHP, travaillent avec du JSON, des API REST ou des bases de données. Nous parlons en français, mais avec des exemples de code concrets. C'est parti !
\n\nPourquoi l'erreur se produit-elle ? La racine du mal : stdClass
\n\nEn PHP, il existe une classe intégrée stdClass (standard class). Elle est utilisée comme objet « vide » lorsque, par exemple, vous appelez json_decode() sans le second paramètre. Par défaut, json_decode retourne un objet, pas un tableau. Et si vous essayez ensuite d'accéder à sa propriété via des crochets, PHP proteste.
<?php\n$json = '{"name": "Anna", "age": 25}';\n$data = json_decode($json); // retourne un objet stdClass\necho $data['name']; // Fatal error: Cannot use object of type stdClass as array\n?>\n\n\nUn objet et un tableau en PHP sont des types différents. Pour un objet, l'accès aux propriétés se fait via ->, pour un tableau via []. On ne peut pas les mélanger. Mais que faire si vous ne contrôlez pas la source des données ? Ou si dans du code legacy tout repose sur des tableaux ? Voyons cela.
Approche 1 : Cast de type (array) — rapide, mais avec des surprises
\n\nLa méthode la plus évidente est de caster explicitement l'objet en tableau avec (array). Cela fonctionne, mais pas toujours comme vous l'attendez.
<?php\n$json = '{"name": "Anna", "age": 25}';\n$data = (array) json_decode($json);\necho $data['name']; // Anna — ça marche !\n?>\n\n\nTout va bien ? Pas tout à fait. Si l'objet contient des objets imbriqués, ils ne sont pas convertis récursivement. À l'intérieur, il restera des stdClass, et en essayant d'y accéder comme à un tableau, l'erreur reviendra.
<?php\n$json = '{"user": {"name": "Anna", "age": 25}}';\n$data = (array) json_decode($json);\necho $data['user']['name']; // Encore une erreur ! user est un objet\n?>\n\n\nQuand l'utiliser : pour des structures JSON plates, sans imbrication. Rapide, mais peu profond.
\n\nApproche 2 : json_decode avec le flag true — le standard en or
\n\nLa méthode la plus populaire et fiable est de passer true comme second argument à json_decode. Alors la fonction retourne un tableau associatif, et non un objet. Et les structures imbriquées seront aussi des tableaux.
<?php\n$json = '{"user": {"name": "Anna", "age": 25}}';\n$data = json_decode($json, true); // true — retourne un tableau\necho $data['user']['name']; // Anna — sans erreur\n?>\n\n\nCette approche est recommandée dans la documentation PHP et par la communauté. Elle résout le problème à la racine, sans nécessiter de conversions supplémentaires.
\n\nQuand l'utiliser : toujours, lorsque vous travaillez avec du JSON et attendez un tableau. Le seul inconvénient est si vous oubliez de mettre true.
Approche 3 : Conversion récursive — pour les structures complexes
\n\nParfois, les données ne viennent pas seulement du JSON, mais aussi d'autres sources : bases de données, SOAP, parseurs XML. Et vous obtenez un objet tout prêt qu'il faut transformer en tableau à tout prix. Une fonction récursive vous aidera.
\n\n<?php\nfunction objectToArray($data) {\n if (is_object($data)) {\n $data = get_object_vars($data);\n }\n if (is_array($data)) {\n