Il y a beaucoup de mystère et de désinformation sur ce domaine fondamental de PHP. Chaque développeur PHP apprend comment faire apparaître du texte sur une page. Généralement, c’est avec l’aide d’echo. Plus tard, ils doivent comprendre ce qui se trouve réellement à l’intérieur d’une variable, et on leur apprend/découvre soit print_r(), soit var_dump().
Ce soir, j’ai assisté à un atelier, où certains aspects de PHP étaient enseignés à des personnes novices dans le langage. Ces types d’ateliers sont difficiles à donner, parce que les gens vont poser des questions que seules les personnes nouvelles pourraient poser, et souvent elles concernent des domaines du langage depuis longtemps oubliés ou ignorés par les développeurs PHP expérimentés.
L’un des participants a demandé quelle était la différence entre echo et print, et immédiatement j’ai pensé assez certain de leur fonction. Puis j’ai pensé aux différences subtiles entre toutes les fonctions d’impression variables, et comment elles ne sont jamais vraiment expliquées en détail. Changeons cela !
echo est une construction du langage qui ressemble à une fonction, mais qui n’en est pas une. Selon la documentation ; il sort plusieurs paramètres (chaîne de caractères), pourtant quand je tente ceci, il génère une erreur de syntaxe :
php > echo("foo", "bar", "baz");
PHP Parse error: syntax error, unexpected ',' in php shell code on line 1
Que cela soit, les parenthèses sont facultatives :
php > echo "foo"; echo("bar");
foobar
echo ne retourne pas de valeur. Son seul travail est de sortir une chaîne de caractères.
Il semble que j’aurais dû essayer plusieurs chaînes de caractères sans les crochets. Merci à ceux qui l’ont signalé. ☺
Contrairement à echo ; la documentation de print indique correctement qu’il sortira une seule chaîne de caractères. Ce n’est pas non plus strictement une fonction, mais bizarrement, elle retournera toujours 1. En conséquence, les choses suivantes se produisent :
php > print "foo"; print("bar"); print print print "baz";
foobarbaz11
Étrange. Définitivement étrange.
print_r
Après ces constructions pratiquement similaires, print_r commence à développer l’idée de sortir une variable. L’idée derrière print_r est de sortir/renvoyer une représentation lisible par l’homme d’une seule variable:
php > print_r("foo"); print_r(2); print_r(true);
foo21
Le second paramètre (booléen) de print_r indique à PHP s’il doit retourner la valeur ou la sortir. true signifie retour, false signifie sortie. La valeur par défaut est false.
php > echo print_r(, true);
Array
(
=> bar
)
print_r retournera beaucoup d’informations pour les objets profondément imbriqués. Quand il repère des références récursives, il les omettra, et affichera *RECURSION*. Vous pouvez également avoir remarqué qu’il y a des espaces blancs entourant certaines parties de la sortie, ce qui rend la sortie plus facile à lire.
var_dump
De manière similaire, var_dump() sort une représentation d’une ou plusieurs variables. Comme echo, la documentation de var_dump() indique qu’elle gère des variables multiples. Contrairement à echo, cela semble être vrai:
php > var_dump("foo", "bar");
string(3) "foo"
string(3) "bar"php > var_dump(new StdClass);
class stdClass#1 (0) {
}
var_dump() montre également des données imbriquées, mais l’installation de l’extension XDebug limitera cela à trois niveaux de profondeur, et nécessitera un changement de configuration pour en montrer davantage encore.
Ce changement de configuration XDebug que vous devrez faire est xdebug.var_display_max_depth=n.
var_dump() ne sort pas d’espace blanc supplémentaire, ce qui rend difficile la lecture de la sortie. En outre, l’extension XDebug enveloppera tout dans des éléments HTML (pour la coloration syntaxique), donc la lecture de la sortie de var_dump() est un cauchemar sur la ligne de commande.
var_export
var_export() est similaire à print_r(), en ce sens qu’il peut sortir directement, ou retourner une chaîne. Cependant, la sortie/retour est une syntaxe PHP valide:
php > var_export();
array (
'foo' => 'bar',
)
Vous ne trouverez pas souvent une bonne utilisation de cette méthode, et quand vous le ferez, vous retournerez probablement (plutôt que de sortir) la représentation. Lorsque vous lui passez une instance, vous obtenez une représentation assez étrange :
php > $instance = new Thing();
php > $instance->foo = "bar";
php > var_export($instance);
Thing::__set_state(array(
'foo' => 'bar',
))
Si ce code était analysé ; la méthode __set_state() serait appelée sur la classe Chose. Voici un exemple de ce que vous pourriez faire alors:
class Thing
{
public $foo;
public static function __set_state($state)
{
$thing = new Thing();
$thing->foo = $state;
return $thing;
}
}
Vous devriez également noter que les variables de ressources ne peuvent pas être exportées:
php > var_export(fopen("http://google.com", "r"));
NULL
C’est génial pour résoudre un problème très spécifique ; lire, mettre à jour et écrire des fichiers de configuration PHP:
return ;
Ceci provient de config.php
$config = file_get_contents("config.php");
$config = "world";
file_put_contents(
"config.php",
"return " . var_export($config, true) . ";"
);
C’est à partir de update.php
return array (
'foo' => 'bar',
'hello' => 'world',
);
C’est à partir de config.php
.