stdClass comme tableau : le piège PHP que vous contournerez

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Vous écrivez du code, et PHP vous crie : « Ne me touche pas comme un tableau ! »

\n\n

Imaginez : 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.

\n\n

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\n

Pourquoi l'erreur se produit-elle ? La racine du mal : stdClass

\n\n

En 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.

\n\n
<?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\n

Un 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.

\n\n

Approche 1 : Cast de type (array) — rapide, mais avec des surprises

\n\n

La méthode la plus évidente est de caster explicitement l'objet en tableau avec (array). Cela fonctionne, mais pas toujours comme vous l'attendez.

\n\n
<?php\n$json = '{"name": "Anna", "age": 25}';\n$data = (array) json_decode($json);\necho $data['name']; // Anna — ça marche !\n?>\n
\n\n

Tout 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.

\n\n
<?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\n

Quand l'utiliser : pour des structures JSON plates, sans imbrication. Rapide, mais peu profond.

\n\n

Approche 2 : json_decode avec le flag true — le standard en or

\n\n

La 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.

\n\n
<?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\n

Cette 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\n

Quand l'utiliser : toujours, lorsque vous travaillez avec du JSON et attendez un tableau. Le seul inconvénient est si vous oubliez de mettre true.

\n\n

Approche 3 : Conversion récursive — pour les structures complexes

\n\n

Parfois, 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                

Blogs

Book Recommendations