PHP: diferencias entre echo, print, print_r y var_dump PHP
Estas cuatro funciones de PHP son muchas veces utilizadas de forma indistinta. En principio, las cuatro imprimen cadenas de texto en pantalla y lo más habitual es utilizar echo
y print
para imprimir texto en general y utilizar print_r
y var_dump
para imprimir información de variables. Pero cada una tiene sus peculiaridades, peculiaridades a las que voy a dedicar este post.
Funciones vs constructores de lenguaje
La primera gran diferencia es que print_r
y var_dump
son funciones reales mientras que echo
y print
son constructores de lenguaje, no son verdaderamente funciones. Los constructores de lenguaje son partes de un programa formados por uno o varios símbolos léxicos que responden a las reglas del lenguaje de programación; como símbolos léxicos, no se pueden descomponer en otros, es decir, un constructor de lenguaje no puede subdividirse en otros constructores. Por su parte, una función es una parte definida de un programa (no del lenguaje de programación) que realiza una determinada tarea. Cada lenguaje de programación suele proveer de una biblioteca de funciones predefinidas, como es el caso de print_r
y var_dump
en PHP.
Cuándo el parser interpreta un código, entiende y sabe que hacer con los constructores de lenguaje sin necesidad de más análisis. Cuándo se encuentra con una función, por el contrario, tiene que comprobar las definiciones del leguanje de programación y convertir el código de la función a constructores de lenguaje. En la mayoría de los casos, un constructor de lenguaje se puede utilizar en el mismo contexto que una función. Los constructores de lenguaje suelen ser ligeramente más rápidos que las funciones y no requieren el uso de paréntesis:
<?php
//print es un constructor de lenguaje
print 'Hola';
//La operación anterior es equivalente a
print('Hola');
//print_r es una función, la siguiente expresión es incorrecta y genera error
print_r 'Hola';
?>
echo vs print
Ambos son constructores de lenguaje que muestran cadenas de texto con diferencias algo sutiles. Esta es la forma y tipo de cada uno:
int print ( string $arg )
void echo ( string $arg1 [, string $... ] )
De la definición anterior podemos deducir que:
print
imprime una cadena, echo
puede imprimir más de una separadas por coma:
print 'Hola';
echo 'Hola', 'Hola de nuevo';
print
devuelve un valor int que según la documentación siempre es 1, por lo que puede ser utilizado en expresiones mientras que echo es tipo void
, no hay valor devuelto y no puede ser utilizado en expresiones:
//Se imprime "Hola" y la variable $foo toma el valor 1
$foo = print 'Hola';
//La siguiente expresión da error
$foo = echo 'Hola';
print_r vs var_dump
Estas dos funciones imprimen los detalles de una variable, incluyendo su valor, en un formato legible por el humano. Si es un array o un objeto también imprimen los detalles de cada elemento. Se utilizan frecuentemente durante la depuración de código, situación en la que var_dump
suele ser más útil por la mayor información que proporciona. Las diferencias:
Si el valor de la variable es una cadena de texto, var_dump
imprime la cadena entre dobles comillas, print_r
no.
print_r
no imprime nada visible para false
y cadenas vacías.
var_dump
proporciona información sobre el tamaño y tipo de datos de la variable y, en el caso de arrays y objetos, de los elementos que la componen. print_r
no da información sobre el tamaño de la variable ni sobre el tipo de datos.
Ejemplo:
$foo = array( 5, 0.0, "Hola", false, '' );
var_dump( $foo );
//Imprime
array(5) {
[0]=> int(5)
[1]=> float(0)
[2]=> string(4) "Hola"
[3]=> bool(false)
[4]=> string(0) ""
}
print_r( $foo );
//Imprime
Array (
[0] => 5
[1] => 0
[2] => Hola
[3] =>
[4] =>
)
print_r
puede devolver el resultado en lugar de imprimirlo si se proporciona el segundo parámetro como true
:
$foo = array( 5, 0.0, "Hola", false, '' );
$output = print_r( $foo, true );