Hay mucho misterio y desinformación sobre esta área fundamental de PHP. Todo desarrollador de PHP aprende a hacer aparecer texto en una página. Normalmente es con la ayuda de echo. Más tarde tienen que averiguar qué hay realmente dentro de una variable, y se les enseña/descubre print_r() o var_dump().
Esta noche he asistido a un taller, en el que se enseñaban algunos aspectos de PHP a personas nuevas en el lenguaje. Este tipo de talleres son difíciles de impartir, porque la gente hará preguntas que sólo la gente nueva haría, y a menudo son sobre áreas del lenguaje olvidadas o ignoradas hace tiempo por los desarrolladores de PHP experimentados.
Uno de los asistentes preguntó cuál era la diferencia entre echo e print, e inmediatamente pensé en su función. Luego pensé en las sutiles diferencias entre todas las funciones de impresión de variables, y cómo nunca se explican en detalle. Vamos a cambiar eso!
echo es una construcción del lenguaje que parece una función, pero no lo es. Según la documentación, da salida a múltiples parámetros (cadenas), pero cuando lo intento genera un error de sintaxis:
php > echo("foo", "bar", "baz");
PHP Parse error: syntax error, unexpected ',' in php shell code on line 1
Sea como sea, los paréntesis son opcionales:
php > echo "foo"; echo("bar");
foobar
echo no devuelve ningún valor. Su único trabajo es dar salida a una cadena.
Parece que debería haber probado varias cadenas sin los paréntesis. Gracias a los que han señalado esto. ☺
A diferencia de echo; la documentación de print indica correctamente que dará salida a una sola cadena. Tampoco es estrictamente una función, pero extrañamente siempre devolverá 1. Como resultado, ocurren las siguientes cosas:
php > print "foo"; print("bar"); print print print "baz";
foobarbaz11
Extraño. Definitivamente extraño.
print_r
Siguiendo estas construcciones prácticamente similares, print_r comienza a desarrollar la idea de dar salida a una variable. La idea detrás de print_r es dar salida/retorno a una representación legible para humanos de una sola variable:
php > print_r("foo"); print_r(2); print_r(true);
foo21
El segundo parámetro (booleano) de print_r le dice a PHP si debe devolver el valor o darle salida. true significa retorno, false significa salida. El valor por defecto es false.
php > echo print_r(, true);
Array
(
=> bar
)
print_r devolverá mucha información para objetos profundamente anidados. Cuando encuentre referencias recursivas, las omitirá y mostrará *RECURSION*. También puede haber notado que hay espacios en blanco rodeando partes de la salida, lo que hace que la salida sea más fácil de leer.
var_dump
De manera similar, var_dump() muestra una representación de una o más variables. Al igual que echo, la documentación de var_dump() dice que manejará múltiples variables. A diferencia de echo esto parece ser cierto:
php > var_dump("foo", "bar");
string(3) "foo"
string(3) "bar"php > var_dump(new StdClass);
class stdClass#1 (0) {
}
var_dump() también muestra datos anidados, pero la instalación de la extensión XDebug limitará esto a tres niveles de profundidad, y requerirá un cambio de configuración para mostrar más de nuevo.
El cambio de configuración de XDebug que tendrá que hacer es xdebug.var_display_max_depth=n.
var_dump() no muestra espacios en blanco extra, por lo que esto dificulta la lectura de la salida. Además, la extensión XDebug envolverá todo en elementos HTML (para resaltar la sintaxis), por lo que leer la salida de var_dump() es una pesadilla en la línea de comandos.
var_export
var_export() es similar a print_r(), ya que puede dar salida directamente, o devolver una cadena. Sin embargo, la salida/retorno es una sintaxis PHP válida:
php > var_export();
array (
'foo' => 'bar',
)
No encontrará a menudo un buen uso para este método, y cuando lo haga probablemente devolverá (en lugar de la salida) la representación. Cuando le pasas una instancia, obtienes una representación bastante extraña:
php > $instance = new Thing();
php > $instance->foo = "bar";
php > var_export($instance);
Thing::__set_state(array(
'foo' => 'bar',
))
Si ese código fuera analizado; el método __set_state() sería llamado en la clase Thing. Aquí hay un ejemplo de lo que podrías hacer entonces:
class Thing
{
public $foo;
public static function __set_state($state)
{
$thing = new Thing();
$thing->foo = $state;
return $thing;
}
}
También debes tener en cuenta que las variables de recursos no pueden ser exportadas:
php > var_export(fopen("http://google.com", "r"));
NULL
Esto es genial para resolver un problema muy específico; leer, actualizar y escribir archivos de configuración de PHP:
return ;
Esto es de config.php
$config = file_get_contents("config.php");
$config = "world";
file_put_contents(
"config.php",
"return " . var_export($config, true) . ";"
);
Esto es de update.php
return array (
'foo' => 'bar',
'hello' => 'world',
);
Esto es de config.php