Introduction : quand le code se brise à cause d'un seul caractère
Imaginez la situation : vous écrivez un script PHP qui récupère des données d'une API tierce. Tout fonctionne parfaitement sur le serveur de test, mais soudainement en production, une erreur fatale apparaît : "Cannot use object of type stdClass as array". Cela vous dit quelque chose ? Si vous avez déjà travaillé avec JSON, REST API ou des bases de données en PHP, vous avez très probablement rencontré ce message sournois.
Cette erreur est l'une des questions les plus populaires sur Stack Overflow (des milliers de vues !), et ce n'est pas pour rien. Elle survient au pire moment et déroute même les développeurs expérimentés. Dans cet article, nous allons voir pourquoi PHP se plaint de stdClass, comparer deux approches pour travailler avec les données (objets vs tableaux) et montrer comment oublier définitivement cette erreur.
Qu'est-ce que stdClass et pourquoi n'est-ce pas "un tableau" ?
Pour commencer, un petit rappel. stdClass en PHP est une classe vide intégrée qui sert de conteneur universel pour les données. Lorsque vous appelez json_decode() sans le second paramètre, PHP retourne un objet de type stdClass. Par exemple :
<?php$json = '{"name": "Анна", "age": 25}';$data = json_decode($json);var_dump($data); // object(stdClass)#1 (2) { ["name"]=> string(8) "Анна" ["age"]=> int(25) }?>L'erreur "Cannot use object of type stdClass as array" se produit lorsque vous essayez d'accéder à un objet stdClass comme s'il s'agissait d'un tableau — avec des crochets. Par exemple :
<?php$json = '{"name": "Анна", "age": 25}';$data = json_decode($json);echo $data['name']; // Erreur fatale !?>PHP crie : "Hé, c'est un objet, pas un tableau ! Utilise la flèche -> !" Et il a raison. Les objets et les tableaux sont des types de données différents, même s'ils se ressemblent structurellement.
Comparaison des approches : objet vs tableau
Voyons en quoi ces deux approches diffèrent et quand utiliser laquelle.
Approche 1 : Travailler avec l'objet stdClass
Si vous laissez les données sous forme d'objet, l'accès aux propriétés se fait via -> :
<?php$json = '{"user": {"name": "Иван", "skills": ["PHP", "JavaScript"]}}';$data = json_decode($json);echo $data->user->name; // Иванecho $data->user->skills[0]; // PHP?>Avantages :
- Code propre, rappelant le travail avec les classes
- Mieux adapté aux données fortement typées
- Moins de risques de modifier accidentellement la structure
Inconvénients :
- Impossible d'utiliser les fonctions de tableau (array_map, array_filter, etc.)
- Plus difficile de parcourir les clés dynamiques
- Erreur lors de l'accès via crochets — un piège fréquent
Approche 2 : Conversion en tableau
Vous pouvez forcer json_decode() à retourner un tableau associatif en passant true comme second paramètre :
<?php$json = '{"user": {"name": "Иван", "skills": ["PHP", "JavaScript"]}}';$data = json_decode($json, true);echo $data['user']['name']; // Иванecho $data['user']['skills'][0]; // PHP?>Avantages :
- Accès via crochets — intuitif
- Possibilité d'utiliser toutes les fonctions de manipulation de tableaux
- Pratique pour les clés dynamiques et les boucles
Inconvénients :
- Moins de contrôle des types (tout devient mixte)
- Ne convient pas au code orienté objet
- Avec une imbrication profonde, le code devient lourd
Scénarios typiques de l'erreur et leurs solutions
L'erreur "Cannot use object of type stdClass as array" se rencontre le plus souvent dans trois situations. Analysons chacune avec des exemples.