Table des matières
Qu’est-ce que print_r() en PHP et à quoi sert-elle ?
print_r() est une fonction native de PHP qui produit une représentation lisible du contenu d’une variable, quelle que soit sa complexité. Elle est disponible depuis PHP 4 et constitue un outil de diagnostic courant pendant la phase de développement d’une application.
Son atout principal réside dans sa capacité à parcourir récursivement les tableaux et les objets pour exposer leur structure interne complète. Elle révèle les clés, les valeurs associées et chaque niveau d’imbrication, y compris les propriétés protégées et privées d’un objet PHP.
Elle s’adresse aux développeurs qui ont besoin d’inspecter rapidement une structure de données sans avoir besoin de connaître le type exact de chaque valeur. Ce compromis entre précision et lisibilité la rend adaptée à la vérification d’une réponse d’API, d’un résultat de requête SQL ou d’un tableau de configuration.
Notez que les membres statiques d’une classe ne sont pas affichés par la fonction, contrairement à var_dump() qui couvre davantage de cas. Gardez également à l’esprit que print_r() déplace le pointeur interne d’un tableau vers sa fin après l’appel : utilisez reset() si vous devez continuer à itérer sur ce tableau juste après.
Syntaxe et paramètres de print_r en PHP
Cette fonction reçoit un argument obligatoire de type mixed et un second argument optionnel de type booléen qui détermine si la sortie est affichée ou retournée sous forme de chaîne.
print_r(mixed $value, bool $return = false): string|true
Par défaut, $return vaut égal à false et la fonction écrit son résultat directement dans le flux de sortie courant. Lorsqu’il est passé à true, elle retourne son résultat sous forme de chaîne exploitable dans votre code, sans rien afficher.
Ce second paramètre est précieux pour capturer le diagnostic d’une variable sans interrompre le rendu de la page. Il évite également de recourir aux fonctions de tampon ob_start() et ob_get_clean(), indispensables avec var_dump() pour le même résultat.
La valeur retournée est true en mode affichage direct, ou une string contenant la sortie complète lorsque $return vaut true. Cette distinction est importante si vous testez la valeur de retour dans une condition logique de votre script.
L’exemple suivant présente les deux modes d’utilisation sur un tableau associatif à structure imbriquée.
<?php
$facture = [
"numero" => "F-2024-089",
"client" => "Marc Bernard",
"lignes" => ["Abonnement mensuel", "Support prioritaire"],
"regle" => false
];
// Mode affichage direct dans le navigateur
echo "<pre>";
print_r($facture);
echo "</pre>";
// Mode capture pour journalisation
$journal = print_r($facture, true);
file_put_contents("app.log", date("Y-m-d H:i:s") . "\n" . $journal, FILE_APPEND);
?>
En mode affichage, la balise <pre> préserve l’indentation produite par print_r() dans le navigateur, rendant la hiérarchie des données immédiatement lisible. En mode capture, la variable $journal contient la représentation complète de la facture, horodatée et prête à être archivée dans un fichier de log applicatif. Vérifiez que $journal n’est pas une chaîne vide avant toute écriture pour éviter de polluer vos fichiers de diagnostic.
Quelle est la différence entre print et Print_r ?
print() et print_r() partagent quatre lettres mais servent des objectifs radicalement différents dans un script PHP. Les confondre est une erreur courante chez les développeurs qui débutent, car leur nom crée une fausse impression de proximité fonctionnelle.
print est un constructeur de langage, au même titre que echo, conçu pour envoyer une chaîne de caractères vers le navigateur à destination de l’utilisateur final. Il retourne systématiquement l’entier 1, ce qui permet son usage dans une expression, mais il n’accepte qu’un seul argument de type scalaire.
print_r() est une fonction de débogage qui inspecte n’importe quel type de donnée PHP, des scalaires aux structures complexes comme les tableaux multidimensionnels et les instances de classe. Sa valeur de retour dépend du paramètre $return : true en mode affichage, ou une string en mode capture.
Cet exemple montre concrètement ce qui se produit lorsqu’on applique chacun des deux outils sur un tableau PHP.
<?php
$categories = ["Electronique", "Informatique", "Périphériques"];
print $categories;
// PHP Warning: Array to string conversion → affiche "Array"
print_r($categories);
/*
Array
(
[0] => Electronique
[1] => Informatique
[2] => Périphériques
)
*/
?>
print tente de convertir le tableau en chaîne, ce qui déclenche un avertissement PHP de niveau E_WARNING et produit uniquement le mot "Array", sans aucune information utile. print_r() parcourt chaque entrée du tableau et restitue sa clé numérique avec la valeur correspondante dans un format structuré. Cette démonstration suffit à comprendre que print appartient à la couche de présentation, tandis que print_r() appartient à la couche de diagnostic.
| Critère | print | print_r() |
|---|---|---|
| Nature | Constructeur de langage | Fonction native |
| Valeur retournée | Toujours 1 | true ou string |
| Types acceptés | Scalaires uniquement | mixed (tableaux, objets…) |
| Affiche le type | Non | Non |
| Membres statiques | — | Non affichés |
| Usage principal | Affichage utilisateur | Débogage développeur |
Comment utiliser print_r avec des objets en PHP ?
print_r() inspecte non seulement les tableaux mais aussi les instances de classe, en affichant leurs propriétés publiques, protégées et privées. Cette capacité la rend utile pour diagnostiquer l’état interne d’un objet à un instant précis de l’exécution.
Elle identifie chaque propriété par son nom et affiche sa valeur courante, quel que soit son niveau de visibilité. Les propriétés statiques sont en revanche exclues de la sortie, ce qui constitue une limite importante à connaître avant de l’utiliser sur des classes complexes.
Voici un exemple sur une classe Utilisateur avec trois niveaux de visibilité différents pour observer ce que print_r() expose réellement.
<?php
class Utilisateur
{
public string $nom = "Alice Dupont";
protected int $age = 34;
private string $token = "x9f2k7z";
public static int $count = 0;
public function __construct()
{
self::$count++;
}
}
$user = new Utilisateur();
echo "<pre>";
print_r($user);
echo "</pre>";
/*
Utilisateur Object
(
[nom] => Alice Dupont
[age:protected] => 34
[token:Utilisateur:private] => x9f2k7z
)
*/
?>
La sortie indique clairement le niveau de visibilité de chaque propriété entre crochets : protected et private sont explicitement mentionnés. La propriété statique $count n’apparaît pas, confirmant la limite de print_r() sur ce type de membre. Si vous avez besoin d’inspecter les membres statiques, utilisez var_dump() ou la classe ReflectionClass de PHP.
Comment fonctionne print_r() sur un objet imbriqué ?
Les applications modernes manipulent fréquemment des objets contenant d’autres objets comme propriétés, par exemple une commande liée à un client et à une adresse. La fonction parcourt récursivement ces imbrications et expose la hiérarchie complète des données.
Ce comportement est précieux pour diagnostiquer des structures issues d’un ORM comme Doctrine, ou d’une désérialisation JSON convertie en objet avec json_decode().
<?php
class Adresse
{
public string $ville = "Paris";
public string $codePostal = "75001";
}
class Client
{
public string $nom = "Marc Bernard";
public Adresse $adresse;
public function __construct()
{
$this->adresse = new Adresse();
}
}
$client = new Client();
echo "<pre>";
print_r($client);
echo "</pre>";
/*
Client Object
(
[nom] => Marc Bernard
[adresse] => Adresse Object
(
[ville] => Paris
[codePostal] => 75001
)
)
*/
?>
La sortie reflète fidèlement la relation entre Client et Adresse, avec une indentation automatique qui matérialise la profondeur de l’imbrication. Chaque objet imbriqué est clairement identifié par son nom de classe suivi de Object, ce qui facilite la lecture de structures complexes. Notez que les références circulaires entre objets provoquent une sortie infinie : print_r() les détecte et les signale avec *RECURSION* pour éviter une boucle sans fin.
Comment afficher un objet issu de json_decode() avec sprint_r()
json_decode() convertit par défaut une chaîne JSON en objet de type stdClass, une classe générique de PHP sans propriétés prédéfinies. print_r() est particulièrement adaptée pour visualiser rapidement ce type de structure dynamique dont vous ne connaissez pas encore les champs.
<?php
$json = '{"id": 5, "produit": "Écran 4K", "prix": 349.90, "disponible": true}';
$objet = json_decode($json);
echo "<pre>";
print_r($objet);
echo "</pre>";
/*
stdClass Object
(
[id] => 5
[produit] => Écran 4K
[prix] => 349.9
[disponible] => 1
)
*/
?>
La sortie affiche le nom de classe stdClass suivi de chaque propriété dynamique créée à partir des clés JSON. Notez que disponible vaut 1 au lieu de true : la fonction ne précise pas le type booléen, contrairement à var_dump() qui afficherait bool(true). Si la distinction entre 1 et true est importante dans votre contexte, privilégiez var_dump() pour ce diagnostic.
Sources: PHPnet